Ini adalah sistem operasi pertama yang saya buat. Ini ditulis dalam dua bahasa: C Bahasa dan Majelis.
Proyek ini telah diaktifkan sejak 15 Desember 2017

Rencana kerja
Bootloader
Kebiasaan
Sektor boot
Tahap 2
Grub
Inti
Manajemen memori
Alokasi bingkai halaman
Alokasi memori dinamis
Sistem bangunan
Tulis teks ke VGA
CPU Interrupt (IDT, ISRS, IRQS, dll.)
Baca karakter dari keyboard PS/2
Baca string dari keyboard PS/2
Memori virtual (paging, bingkai, dll.)
Alokasi dan de-alokasi bingkai halaman
Alokasi memori dinamis (LIBalloc)
Timer CPU
Dapatkan informasi CPU
Jam real-time: jadi kita bisa tahu kapan film dimulai
Kernel Stack Trace
Multitasking
Proses mode pengguna
Pengemudi hard disk
Driver floppy disk
Sistem file
Antarmuka pengguna grafis
OS ini menggunakan bootloader 2-stage. Jika tahap kedua adalah ketika kami memasuki mode yang dilindungi dan memanggil kernel.
512 byte pertama dari gambar floppy saya berisi sektor boot yang melakukan banyak hal yang tidak dapat dilakukan oleh mode yang dilindungi . (misalnya memuat barang dari disk). Kemudian melompat ke tahap kedua dimuat pada 0x7E00 (tepat setelah sektor boot).
Tahap ini memuat GDT dan memasuki mode yang dilindungi , kemudian menyalin kernel yang dimuat berdasarkan sektor boot pada 0x1000 hingga 0x100000 (1 MB). Lompat terakhir!
Ukuran kernel selalu tumbuh, tetapi saya tidak selalu dapat meningkatkan sektor untuk memuat. Sebagai solusi. Saya memutuskan untuk menggunakan Grub. Kernel disimpan sebagai gambar ELF ( kernel.img ) dalam CD yang menggunakan ISO 9660 sebagai sistem file. Grub juga mendukung multiboot, sehingga sistem operasi saya dapat bekerja sama dengan orang lain (Windows, Linux, dll.).
Kami memasuki mode terlindungi yang berarti kami tidak memiliki akses ke fungsi BIOS. Jadi, kernel ini perlu mengimplementasikan kembali fungsi-fungsi tersebut untuk mengendalikan perangkat keras.
Sekarang, saya telah mengimplementasikan kembali perangkat standar: layar dan keyboard. Dalam pengembangan lebih lanjut. Saya akan menerapkan driver disk.
Sistem operasi ini menggunakan segmentasi dan paging untuk memberikan perlindungan memori. Di tabel deskriptor global saya, saya menempatkan 5 deskriptor segmen:
Segmen nol
Segmen Kode untuk Kernel : Segmen tempat kode kernel saya berada
Segmen Data untuk Kernel : Segmen tempat variabel global kernel saya
Segmen Kode untuk Pengguna : Saat ini tidak menggunakan
Segmen Data untuk Pengguna : Sama dengan 4
Saya juga mengaktifkan paging. Sekarang saya sengaja memetakan halaman keempat di tabel halaman pertama untuk not-present dan read-only , sehingga Anda dapat menghasilkan kesalahan halaman dengan mengeksekusi bsod di baris perintah OS saya.

Kernel ini menyediakan alokasi bingkai halaman , sehingga manajemen memori akan lebih nyaman dan saya akan lebih mudah untuk mendekati multitasking.
Seperti yang disarankan oleh tutorial JamesM, saya akan menggunakan bitset untuk menentukan apakah bingkai gratis atau tidak.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
Saat ini saya telah menerapkan malloc penempatan tanpa gratis karena semua variabel yang digunakan oleh kernel tidak perlu dibebaskan sampai kekuatan mati.
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
Karena saya malas, saya port pengalokasi memori pihak ke -3 yang disebut liballoc yang hanya membutuhkan beberapa fungsi di OS saya.
Proyek ini menggunakan GNU Make untuk membangun. Jadi, cara membangun adalah dengan make , jika ada masalah yang terjadi selama build, ketik make dep sebelum make . Buka masalah jika masih macet.
Jika Anda tidak menggunakan Linux atau WSL (Subsistem Windows untuk Linux), Anda harus mengunduh kompiler silang dari sini. Kemudian ubah CC dan LD di config.mk .