Writing an OS in Rust

Philipp Oppermann's blog

كتابة نظام تشغيل بلغة Rust

تنشئ سلسلة المدونات هذه نظام تشغيل صغير بلغة البرمجة Rust . كل منشور هو عبارة عن برنامج تعليمي صغير ويتضمن كل الشيفرة المطلوبة، لذا يمكنك المتابعة إذا أردت. الكود المصدري متاح أيضًا في مستودع Github المقابل.

آخر منشور: Async/Await

ثنائي Rust مستقل

تتمثل الخطوة الأولى في إنشاء نواة نظام التشغيل الخاصة بنا في إنشاء ملف Rust قابل للتنفيذ لا يربط المكتبة القياسية. هذا يجعل من الممكن تشغيل شيفرة Rust على bare metal دون نظام تشغيل أساسي.

اقرأ المزيد »

نواة Rust بسيطة للغاية

في هذا المقال، سنقوم بإنشاء نواة Rust بسيطة من 64-bit لمعمارية x86. نحن نبني على الثنائي المستقل لـ Rust من المقال السابق لإنشاء صورة قرص قابلة للإقلاع تطبع شيئًا ما على الشاشة.

اقرأ المزيد »

وضع نص VGA

وضع نص VGA هو طريقة بسيطة لطباعة النص على الشاشة. في هذا المنشور، ننشئ واجهة تجعل استخدامه آمناً وبسيطاً عن طريق تغليف كل الكود غير الآمن في وحدة منفصلة. كما ننفّذ دعماً لـماكرو التنسيق في Rust.

اقرأ المزيد »

الاختبار

يستكشف هذا المقال اختبارات الوحدة والتكامل في executables no_std. سنستخدم دعم Rust لـ test frameworks المخصصة لتنفيذ دوال الاختبار داخل نواتنا. للإبلاغ عن النتائج خارج QEMU، سنستخدم ميزات مختلفة من QEMU وأداة bootimage.

اقرأ المزيد »

استثناءات وحدة المعالجة المركزية

تحدث CPU exceptions في حالات خاطئة مختلفة، على سبيل المثال، عند الوصول إلى عنوان ذاكرة غير صالح أو عند القسمة على صفر. للتفاعل معها، يجب علينا إعداد interrupt descriptor table يوفر دوال معالجة. في نهاية هذا المقال، ستتمكن نواتنا من catch breakpoint exceptions واستئناف التنفيذ العادي بعدها.

اقرأ المزيد »

الأخطاء المزدوجة

يستكشف هذا المقال double fault exception بالتفصيل، التي تحدث عندما تفشل وحدة المعالجة المركزية في استدعاء exception handler. بمعالجة هذه exception، نتجنب triple faults القاتلة التي تسبب إعادة ضبط النظام. لمنع الأخطاء الثلاثية (triple faults) في جميع الحالات، نُعدّ أيضًا Interrupt Stack Table لالتقاط double faults على kernel stack منفصل.

اقرأ المزيد »

مقاطعات العتاد

في هذا المقال، نُعدّ متحكم المقاطعات القابل للبرمجة لإعادة توجيه المقاطعات العتادية إلى وحدة المعالجة المركزية بشكل صحيح. لمعالجة هذه المقاطعات، نضيف entries جديدة إلى interrupt descriptor table، تمامًا كما فعلنا لمعالجي exceptions. سنتعلم كيفية الحصول على timer interrupts دورية وكيفية الحصول على إدخال من لوحة المفاتيح.

اقرأ المزيد »

مقدمة إلى Paging

يقدم هذا المقال paging، مخطط إدارة ذاكرة شائع جدًا سنستخدمه أيضًا لنظام التشغيل الخاص بنا. يشرح لماذا نحتاج إلى عزل الذاكرة، كيف تعمل segmentation، ما هي virtual memory، وكيف يحل paging مشكلة تجزئة الذاكرة. يستكشف أيضًا تخطيط multilevel page tables على معمارية x86_64.

اقرأ المزيد »

تنفيذ Paging

يُظهر هذا المقال كيفية تنفيذ دعم paging في نواتنا. يستكشف أولاً تقنيات مختلفة لجعل physical page table frames قابلة للوصول من النواة ويناقش مزاياها وعيوبها. ثم ينفذ دالة ترجمة عنوان ودالة لإنشاء تعيين جديد.

اقرأ المزيد »

تخصيص Heap

يضيف هذا المقال دعم تخصيص heap لنواتنا. أولاً، يقدم مقدمة عن الذاكرة الديناميكية ويُظهر كيف يمنع borrow checker أخطاء التخصيص الشائعة. ثم ينفذ واجهة التخصيص الأساسية في Rust، ويُنشئ منطقة ذاكرة heap، ويُعدّ allocator crate. في نهاية هذا المقال، ستكون جميع أنواع التخصيص والجمع لمكتبة alloc المدمجة متاحة لنواتنا.

اقرأ المزيد »

تصاميم المخصصات

يشرح هذا المقال كيفية تنفيذ مخصصات heap من الصفر. يعرض ويناقش تصاميم مختلفة للمخصصات، بما في ذلك bump allocation و linked list allocation و fixed-size block allocation. لكل من التصاميم الثلاثة، سننشئ تنفيذًا أساسيًا يمكن استخدامه لنواتنا.

اقرأ المزيد »

Async/Await

في هذا المقال، نستكشف cooperative multitasking وميزة async/await في Rust. نلقي نظرة مفصلة على كيفية عمل async/await في Rust، بما في ذلك تصميم trait Future، وتحويل state machine، و pinning. ثم نضيف دعمًا أساسيًا لـ async/await لنواتنا بإنشاء مهمة لوحة مفاتيح غير متزامنة و executor أساسي.

اقرأ المزيد »

Status Updates

These posts give a regular overview of the most important changes to the blog and the tools and libraries behind the scenes.

First Edition

You are currently viewing the second edition of “Writing an OS in Rust”. The first edition is very different in many aspects, for example it builds upon the GRUB bootloader instead of using the `bootloader` crate. In case you're interested in it, it is still available. Note that the first edition is no longer updated and might contain outdated information. read the first edition »

ادعمني

إنشاء وصيانة هذه المدونة والمكتبات المرتبطة بها يتطلب جهدًا كبيرًا، لكنني أستمتع حقًا بذلك. بدعمك لي، يمكنني تخصيص وقت أكثر لإنشاء محتوى جديد وميزات جديدة والصيانة المستمرة. أفضل طريقة لدعمي هي رعايتي على GitHub. شكرًا لك!