مرحبا يا هبر!
اسمي فيكتور ، وهذا العام أنا الطالب الوحيد في برنامج Google Summer of Code في مشروع ReactOS. اليوم سأخبركم قليلاً عما أقوم به كجزء من التدريب.
يدعم ReactOS مجموعة من جميع أنواع أنظمة الملفات المختلفة للقراءة والكتابة (fat32 و ext2 و
ReiserFS و
BTRFS ) ، ولكن لا يزال بإمكانه التمهيد فقط من قسم تم تنسيقه في FAT32. هذا الربيع ، قررت أن الوقت قد حان لبدء تصحيح هذا الوضع ، وتقدمت بطلب للحصول على GSoC. وهكذا ، بعد بضعة أشهر أكتب هذا المنشور :)
لماذا BTRFS؟ الجواب بسيط -
برنامج تشغيل نظام ملفات
WinBtrfs هو حاليًا الأكثر استقرارًا ويعمل بكامل طاقته من بين كل ما يتم تضمينه في رمز ReactOS. في هذه المرحلة ، نريد إصلاح أخطاء kernel التي تمنع استخدام FS الآخر للتحميل ، لذا فإن أخطاء برنامج تشغيل FS ليست مفيدة لنا تمامًا.

ولكن كان علي أن أبدأ ليس من نواة نظام التشغيل ، ولكن من المثبت. لحسن الحظ ، كان كل شيء تقريبًا جاهزًا للمثبت: كل ما كان مطلوبًا هو تمكين برنامج تشغيل WinBtrfs من التحميل في المثبت (usetup) ، وإضافة بضعة أسطر من التعليمات البرمجية لدعم التنسيق في نظام الملفات الضروري. وبعد ذلك تمكنت (تقريبًا) من نسخ ملفات ReactOS بسهولة إلى القسم المنسق في BTRFS.
لقد تعاملوا بسرعة مع المثبت ، ولكن المهمة التالية أكثر إثارة للاهتمام. برنامج تحميل BootctOS - FreeLdr يدعم نظامي ملفات تقريبًا - fat32 و iso (يوجد كود لـ ext2 و ntfs ، لكن لم يحاول أحد تشغيله لمدة 5 سنوات الآن). نظرًا لأن FreeLdr يكرر مبدأ محمل إقلاع ntldr من MS ، فإنه يتكون من جزأين - قطاع التمهيد في بداية القسم حيث يتم نقل MBR إلى القرص ، والجزء الرئيسي ، الذي يضع المعالج في الوضع المحمي ، يقوم بتحميل نواة ntoskrnl.exe في الذاكرة ، ويقوم حفنة من كل شيء.
(هكذا تبدو عملية التمهيد ReactOS)وبالتالي ، لدعم نظام الملفات الجديد ، تحتاج إلى كتابة سجل التمهيد للقسم (VBR) ، وتتمثل مهمته في العثور على الملف القابل للتنفيذ للجزء الرئيسي من أداة تحميل التشغيل (نسميها freeldr.sys) في الدليل الجذر للقرص ، وتحميله في الذاكرة والتحكم في النقل هناك. لكن هذا ليس كل شيء ، يحتاج freeldr.sys نفسه إلى برنامج تشغيل نظام ملف للقراءة فقط شبه كامل لقراءة ملفات التكوين والنواة وشجيرات التسجيل وما إلى ذلك.
أولاً ، كان عليك التعامل مع نظام الملفات BTRFS نفسه. قبل ذلك ، كانت أصعب الأشياء التي اخترتها هي fat32 و ext2 ، لذلك استغرق مني الكثير من الوقت لتعلم حصادة BTRFS. تساعد الوثائق الموجودة على
wiki.kernel.org على
اكتشافها ، ولكن لفهمها بالكامل لم يكن كافياً - كان عليك الذهاب إلى مصادر grub و u-boot وغيرها من أدوات تحميل التمهيد. تبين أن
أداة python
المساعدة التي كتبتها لإخراج هياكل نظام الملفات إلى وحدة التحكم مفيدة جدًا لدراسة بنية نظام الملفات. باستخدامه ، كتبت أول نموذج أولي لقطاع التمهيد ، والذي يسحب أداة تحميل التشغيل من ملف ثنائي مع صورة قرص مع نظام ملفات BTRFS.
(تظهر عناصر الدليل الجذر في الصورة)حان الوقت الآن لقطاع التمهيد الحقيقي. الأمر معقد بسبب حقيقة أننا هنا نعمل في وضع معالج حقيقي مع جميع العواقب المترتبة عليه (~ 1mb من الذاكرة ، والعنونة المجزأة والعمل مع قرص من خلال مقاطعات BIOS). توسيع لعشاق المدرسة القديمة مثلي :)
في هياكل BTRFS ، حجم جميع الحقول تقريبًا 64 بت ، وهو رمز "متضخم" للغاية ، حيث كان يجب استخدام تعليمات 32 بت x86 بنشاط. غالبًا ما يتعين عليك استخدام الإنشاءات مثل:
mov si, SOME_OFFSET lea si, [esi+ecx*8] lea si, [esi+ecx*8] lea si, [esi+ecx*8] // one element is 24 bytes long
كانت المهمة الأكثر استهلاكًا للوقت هي كتابة إجراء اجتياز شجرة b ، واستغرق الأمر وقتًا طويلاً لتصحيحها. وبعد عدة ليال بلا نوم ، تمكنت من الحصول على رسالة الخطأ المنشودة من مرحلة التنزيل الثانية:

تمكنت freeldr.sys من التحميل بنجاح في الذاكرة ، ولم تكن بحاجة حتى إلى استخدام السحر مثل
Unreal Mode . 640 كيلو بايت كافية للجميع!
يمكن عرض رمز قطاع التمهيد في مستودع
جيثوب الخاص بي (لا تزال إعادة البيع تنتظره) ، وجميع الأعمال على BTRFS في
هذا الموضوع.
الآن حان دور الجزء الثاني من أداة تحميل التشغيل - تحتاج إلى تعليمها لقراءة ملف التكوين من نظام الملفات الجديد. تابع الأخبار!