Halo, Habr!
Nama saya Victor, dan tahun ini saya satu-satunya siswa dalam program Google Summer of Code pada proyek ReactOS. Hari ini saya akan menceritakan sedikit tentang apa yang saya lakukan sebagai bagian dari magang.
ReactOS mendukung banyak jenis sistem file yang berbeda untuk membaca dan menulis (fat32, ext2,
ReiserFS ,
BTRFS ), namun itu masih bisa boot dari partisi yang diformat dalam fat32. Musim semi ini, saya memutuskan sudah waktunya untuk mulai memperbaiki situasi ini, dan mengajukan permohonan untuk GSoC. Maka, beberapa bulan kemudian saya menulis posting ini :)
Kenapa BTRFS? Jawabannya sederhana -
driver sistem file
WinBtrfs saat ini
adalah yang paling stabil dan berfungsi penuh dari semua yang termasuk dalam kode ReactOS. Pada tahap ini, kami ingin memperbaiki bug kernel yang mencegah FS lain menggunakan untuk memuat, sehingga bug driver FS sama sekali tidak berguna bagi kami.

Tetapi saya harus memulai bukan dari kernel OS, tetapi dari installer. Untungnya, hampir semuanya sudah siap untuk pemasang: yang diperlukan hanyalah mengaktifkan pengunduhan driver WinBtrf di pemasang kami (usetup), dan menambahkan beberapa baris kode untuk mendukung pemformatan dalam sistem file yang diperlukan. Setelah itu saya dapat (hampir) dengan mudah menyalin file ReactOS ke partisi yang diformat dalam BTRFS.
Mereka dengan cepat menangani installer, tetapi tugas selanjutnya jauh lebih menarik. Loader ReactOS - FreeLdr mendukung hampir hanya dua sistem file - fat32 dan iso (ada kode untuk ext2 dan ntfs, tetapi belum ada yang mencoba menjalankannya selama sekitar 5 tahun sekarang). Karena FreeLdr mengulangi prinsip bootloader ntldr dari MS, itu terdiri dari dua bagian - sektor boot di awal bagian di mana MBR ditransfer ke disk, dan bagian utama, yang menempatkan prosesor dalam mode terproteksi, memuat kernel ntoskrnl.exe ke dalam memori, dan tidak banyak sekali.
(Seperti inilah proses boot ReactOS)Jadi, untuk mendukung sistem file baru, Anda perlu menulis catatan boot partisi (VBR), tugasnya adalah menemukan file yang dapat dieksekusi dari bagian utama bootloader (kami menyebutnya freeldr.sys) di direktori root disk, memuatnya ke dalam memori, dan mentransfer kontrol ke sana. Tapi itu tidak semua, freeldr.sys sendiri membutuhkan driver sistem file read-only yang hampir lengkap untuk membaca file konfigurasi, kernel, semak-semak registri, dll.
Pertama, Anda harus berurusan dengan sistem file BTRFS itu sendiri. Sebelum ini, hal yang paling sulit yang saya pilih adalah FAT32 dan ext2, jadi saya butuh banyak waktu untuk mempelajari pemanen BTRFS. Dokumentasi di
wiki.kernel.org membantu mengetahuinya, tetapi untuk sepenuhnya memahaminya tidak cukup - Anda harus pergi ke sumber grub, u-boot dan boot loader lainnya.
Utilitas python yang saya tulis untuk menampilkan struktur sistem file ke konsol ternyata sangat berguna untuk mempelajari struktur sistem file. Dengan menggunakannya, saya menulis prototipe pertama dari sektor boot, yang menarik bootloader dari file biner dengan gambar disk dengan sistem file BTRFS.
(elemen direktori root terlihat pada gambar)Sekarang saatnya untuk sektor boot nyata. Ini rumit oleh fakta bahwa di sini kita bekerja dalam mode prosesor nyata dengan semua konsekuensi berikutnya (~ 1mb memori, pengalamatan tersegmentasi dan bekerja dengan disk melalui interupsi BIOS). Hamparan untuk penggemar sekolah tua seperti saya :)
Dalam struktur BTRFS, hampir semua bidang berukuran 64-bit, yang merupakan kode yang sangat "gembung", karena instruksi x86 32-bit harus digunakan secara aktif. Seringkali Anda harus menggunakan konstruksi seperti:
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
Tugas yang paling memakan waktu adalah menulis prosedur traversal b-tree, butuh waktu paling lama untuk men-debug-nya. Dan setelah beberapa malam tanpa tidur, saya masih berhasil mendapatkan pesan kesalahan yang didambakan dari tahap unduhan kedua:

freeldr.sys berhasil memuat ke memori, dan bahkan tidak perlu menggunakan sihir seperti
Mode Unreal . 640kb sudah cukup untuk semua orang!
Kode boot sector dapat dilihat di repositori
github saya (refactoring masih menunggunya), dan semua pekerjaan di BTRFS di utas
ini .
Sekarang giliran bagian kedua dari bootloader - Anda perlu mengajarkannya untuk membaca file konfigurasi dari sistem file baru. Ikuti beritanya!