Sistem operasi berbasis x86 yang dibangun dari awal untuk tujuan pembelajaran
int 64 yang membutuhkan deskriptor gerbang untuk eskalasi hak istimewaUntuk membangun sistem operasi (dengan asumsi GCC, NASM diinstal),
makeUntuk berlari di bawah qemu
make qemuUntuk menjalankan (dengan asumsi bochs, bochs-sdl terpasang),
make runBerlari di bawah QEMU dengan dukungan debugging (GDB)
make qemu_gdb(Lampirkan GDB, perintah yang diperlukan sudah disediakan dalam file .gdbinit di dir tingkat atas)
BIOS memulai prosesor dalam mode nyata 16-bit, Grub memulai mode lindung 32 bit. Gambar kernel elf dilengkapi dengan header multiboot sesuai spesifikasi grub, jika Grub menemukan header ini di 512 byte gambar pertama, maka memuat Elf di lokasi 0x100000, memori yang lebih rendah milik BIOS, dan pemetaan perangkat keras/IO lainnya seperti VGA. Kode bootup, dijalankan dari _start titik masuk kernel, dan (Catatan BSS sudah nol diinisialisasi oleh grub),
Alokasi memori strategi first-fit yang sederhana, mengalokasikan memori dari ruang kernel, selama free juga mengelola pemadatan blok bebas yang berdekatan.
Untuk Userspace Malloc/Free disediakan yang mana yang digunakan secara internal panggilan sistem sbrk untuk meningkatkan istirahat sistem (jika diperlukan). Kernel memang diperlukan pengaturan tabel halaman dan pengembalian meningkatkan batas istirahat sistem.
Ini dibagi menjadi pemetaan memori ruang kernel dan pemetaan memori ruang pengguna. Pemetaan ruang kernel tetap konstan dan merupakan bagian dari setiap ruang alamat, hanya terkait tidak dikloning, karena perubahan dari satu proses dalam ruang kernel harus terlihat dari proses lain juga.
Pemetaan ruang pengguna tergantung pada panggilan exec , dan setiap proses memiliki kernel sendiri serta tumpukan pengguna.
Selama sakelar konteks, register CR3 dimuat dengan alamat basis direktori halaman proses saat ini dan yang juga secara internal membatalkan TLB (Buffer Tampilan Tampilan).
Aplikasi ruang pengguna disimpan dalam initramfs , format CPIO Archieve dalam format ELF standar. Selama kernel exec menemukan dan mem -parsing gambar ELF, mengatur tabel halamannya sesuai. Proses Init hanya memulai shell kemudian menggantung di sana selamanya.
Penjadwal berjalan atas nama proses pelaksanaan saat ini, terutama dalam dua kasus,
Kode mode kernel/segmen data terpisah dari kode mode pengguna/segmen data dengan tingkat hak istimewa yang diprogram sesuai. Saat kembali dari pengecualian, perangkat keras muncul CS (segmen kode) dan SS (segmen stack) dari stack untuk kembali ke tingkat hak istimewa yang lebih rendah.
Kami memprogram bingkai tumpukan ini saat membuat tugas baru,
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;X86 Hardware memiliki dukungan bawaan untuk switching tugas, pada dasarnya beralih dari tumpukan pengguna ke stack kernel bersama dengan parameter segmentasi lainnya. Untuk ini setiap tugas perlu diatur dengan TSS sendiri, yang akan dimodifikasi selama pengalihan konteks. Kami tidak akan menggunakan switching tugas perangkat keras, tetapi akan melakukan hal yang sama dalam perangkat lunak itu sendiri. Dalam hal apa pun kita perlu mengatur ATS AT ATAS ONE TSS yang memiliki mode kernel yang valid SS (Stack Segmen) dan ESP (Stack Pointer) untuk tugas saat ini.
FAQ acak
Jangan ragu untuk membayar dan mengirim permintaan gabungan