Construire un système d'exploitation à partir de zéro est l'une des expériences les plus difficiles et les plus enrichissantes que vous puissiez vivre en tant que développeur. Contrairement au développement d'applications de haut niveau, où une bibliothèque existe pour presque tout, le développement de systèmes d'exploitation vous oblige à travailler au plus près du métal, en touchant directement le matériel, en gérant manuellement la mémoire et en contrôlant tous les aspects du fonctionnement de votre machine.
D'après mon expérience, créer un système d'exploitation signifie approfondir le langage assembleur, lutter avec le matériel et lutter contre les crashs, les redémarrages (surtout les redémarrages) et les longues sessions de débogage. Si vous pensez que le débogage d’un chargeur de démarrage est difficile, essayez de le faire sans le luxe des outils modernes. Le développement du système d'exploitation vous amène à remettre en question vos choix de vie plus de fois que vous ne pouvez le compter.
Cela dit, décomposons tout cela, du chargeur de démarrage à un environnement de bureau entièrement fonctionnel où vous pouvez déplacer une souris et ouvrir un éditeur de texte pour taper.
Le bootloader est la première étape de tout parcours de développement de système d'exploitation. Lorsque votre ordinateur s'allume, le BIOS prend le relais, vérifie votre matériel, puis charge votre chargeur de démarrage du disque vers la mémoire. Le travail de ce petit programme consiste à préparer le processeur et à charger le noyau de votre système d’exploitation en mémoire. Vous devez écrire le bootloader en assembleur car vous traitez directement du matériel à ce stade.
Lorsque le chargeur de démarrage démarre, le processeur est en mode réel 16 bits, ce qui signifie qu'il ne peut adresser que 1 Mo de mémoire. La première chose à faire est de charger le noyau depuis le disque et de le déplacer vers la mémoire. Après cela, le chargeur de démarrage fait passer le processeur en mode protégé 32 bits, c'est là que le plaisir commence. Le changement de mode nécessite la configuration de la Global Descriptor Table (GDT) pour gérer les segments de mémoire et l'activation du Protection Enable (PE) dans le registre de contrôle du processeur. Si vous vous trompez, le système se bloque ou se bloque dans une boucle de démarrage, ce qui m'est arrivé plus de fois que je ne voudrais l'admettre.
En mode réel, tout est super limité – registres 16 bits, accès mémoire 1 Mo, aucune protection mémoire. C'est pourquoi passer en mode protégé est si important. Une fois en mode protégé, votre processeur a accès à des registres 32 bits, à un adressage mémoire plus grand et à des fonctionnalités avancées telles que le multitâche et la pagination (mémoire virtuelle). Le chargeur de démarrage a pour objectif de rendre cette transition fluide.
Une fois que le processeur passe en mode protégé, le chargeur de démarrage confie le contrôle au noyau. Le noyau est le cœur du système d'exploitation et est responsable de tout gérer : le matériel, la mémoire, les processus et les ressources système.
Lorsque le noyau démarre, il doit configurer plusieurs systèmes critiques :
Membina inti ialah tugas yang panjang dan kompleks, tetapi ia juga merupakan salah satu yang paling bermanfaat. Di sinilah anda dapat melihat kerja dalaman sistem pengendalian dan mengawal setiap butiran kecil tentang cara mesin anda berkelakuan.
Apabila membina OS, anda perlu memilih bahasa pengaturcaraan yang sesuai untuk setiap tugas. pemuat but biasanya ditulis dalam pemasangan, kerana anda perlu mengawal perkakasan secara langsung. Walau bagaimanapun, sebaik sahaja anda berada dalam mod dilindungi dan menggunakan kernel, kebanyakan pembangun bertukar kepada C kerana ia memberikan anda kawalan tahap rendah tanpa perlu menulis segala-galanya dalam pemasangan.
Sesetengah pembangun menggunakan C++ untuk pembangunan kernel, kerana ia menawarkan ciri berorientasikan objek yang boleh memudahkan pengurusan sistem yang kompleks. Walau bagaimanapun, C++ dilengkapi dengan overhed tambahan, dan pengurusan memori dalam C++ boleh menjadi lebih rumit dalam persekitaran OS. C memberikan anda kuasa mentah dan kesederhanaan yang diperlukan untuk pengaturcaraan sistem.
Dalam pembangunan OS, keselamatan adalah kritikal. Tidak seperti pengaturcaraan peringkat tinggi, di mana ranap sistem mungkin hanya bermaksud mesej ralat atau penutupan aplikasi, dalam pembangunan OS, ranap sistem biasanya bermaksud but semula sistem penuh. Anda bekerja dengan memori secara langsung, yang bermaksud jika anda merosakkan pengurusan memori, anda boleh merosakkan data sistem, menulis ganti struktur penting atau menyebabkan panik kernel.
Inti perlu melaksanakan perlindungan memori untuk menghalang satu proses daripada menimpa memori yang lain. Ini dilakukan menggunakan paging, yang memetakan setiap proses ke ruang memori mayanya sendiri. Jika anda salah melakukan ini, keseluruhan sistem menjadi tidak stabil, dan anda akan mengejar pepijat memori selama beberapa hari. Percayalah, saya pernah ke sana.
Kelajuan ialah faktor utama dalam menjadikan OS anda berasa responsif. Kernel yang perlahan bermaksud sistem yang perlahan, jadi pengoptimuman untuk prestasi adalah penting. Berikut ialah beberapa bidang utama yang menentukan kelajuan:
Sekarang anda telah menjalankan kernel, tiba masanya untuk membina pemacu untuk berinteraksi dengan perkakasan. Pemacu ialah jambatan antara OS anda dan perkakasan, membolehkan OS berkomunikasi dengan perkara seperti papan kekunci, paparan dan pemacu cakera.
Pada mulanya, OS anda mungkin akan bermula dalam mod teks, di mana anda mencetak aksara terus ke memori video (biasanya di alamat 0xB8000). Ini bagus untuk nyahpepijat dan output asas, tetapi akhirnya, anda akan mahu beralih ke antara muka pengguna grafik (GUI). Ini memerlukan pemacu video yang boleh mengurus kawalan tahap piksel, resolusi skrin dan kedalaman warna.
Menyediakan pemacu video ialah langkah besar ke arah mencipta OS grafik, tetapi ia juga merupakan salah satu tugas yang lebih kompleks kerana ia melibatkan pemahaman cara perkakasan paparan anda berfungsi dan mengurus sejumlah besar data untuk setiap bingkai.
pemacu papan kekunci ialah salah satu bahagian terpenting dalam OS interaktif. Apabila anda menekan kekunci, papan kekunci menghantar kod imbasan ke CPU. Tugas pemacu papan kekunci adalah untuk menterjemahkan kod imbasan itu kepada watak atau tindakan yang boleh difahami oleh OS. Ini melibatkan penyediaan pengendali gangguan untuk IRQ1, gangguan perkakasan yang dihasilkan oleh papan kekunci.
Sebaik sahaja pemacu papan kekunci berfungsi, anda boleh mula membina antara muka pengguna yang lebih kompleks, mengambil input daripada pengguna dan memproses arahan.
Pemacu I/O ialah perkara yang membolehkan OS anda membaca dan menulis ke cakera. Ini penting untuk perkara seperti memuatkan atur cara, menyimpan fail dan menyimpan data. Pada mulanya, anda mungkin akan berinteraksi dengan cakera menggunakan gangguan BIOS, tetapi apabila OS anda matang, anda akan mahu beralih ke lebih banyak
kaedah I/O lanjutan yang tidak bergantung pada BIOS, seperti berkomunikasi terus dengan pengawal cakera.
Sebaik sahaja pemacu asas anda berfungsi, tiba masanya untuk membina shell – antara muka baris perintah (CLI) yang membolehkan pengguna berinteraksi dengan OS. Shell ialah tempat pengguna boleh menaip arahan, melaksanakan program dan berinteraksi dengan sistem fail.
Melaksanakan shell ialah langkah yang menarik kerana ia merupakan salah satu tempat pertama OS anda mula berasa interaktif. Anda perlu mengendalikan input pengguna (dari papan kekunci), memproses arahan dan melaksanakan program. Di sinilah juga anda mula melihat kepentingan keupayaan kernel anda untuk berbilang tugas dan mengurus proses dengan cekap.
sistem fail ialah perkara yang membolehkan OS anda menyimpan dan mendapatkan semula data pada cakera. Walaupun anda boleh menggunakan sistem fail sedia ada (seperti FAT atau ext4), membina sistem fail tersuai anda sendiri memberi anda lebih kawalan dan boleh menjadi cabaran yang menyeronokkan.
Sistem fail asas hendaklah:
Apabila OS anda berkembang, anda juga perlu mengendalikan ciri yang lebih maju seperti:
Merancang sistem fail adalah sukar kerana ia melibatkan pengimbangan prestasi, kebolehpercayaan dan kemudahan penggunaan. Sistem fail yang direka bentuk dengan buruk boleh menyebabkan kerosakan data, prestasi perlahan atau ruang terbuang pada cakera.
Sekarang OS anda mempunyai CLI dan boleh mengendalikan input papan kekunci, tiba masanya untuk menambah sokongan tetikus. Pemacu tetikus bertanggungjawab untuk menjejaki pergerakan tetikus dan menterjemahkannya ke dalam tindakan pada skrin seperti menggerakkan kursor atau mengklik butang.
Membina pemacu tetikus melibatkan pengendalian IRQ12, gangguan perkakasan yang dijana oleh tetikus dan memproses data pergerakan. Setelah anda memasang pemacu tetikus, anda boleh mula berfikir tentang membina antara muka pengguna grafik (GUI).
Satu antara muka pengguna grafik (GUI) membawa OS anda daripada antara muka baris arahan kepada sesuatu yang kelihatan dan kelihatan seperti persekitaran desktop moden. Pada peringkat ini, anda perlu membina tetingkap, butang, menu dan elemen interaktif lain yang pengguna boleh klik dengan tetikus.
Mencipta GUI melibatkan pengurusan perenderan grafik (melukis tetingkap dan ikon), mengendalikan peristiwa input (klik, menekan kekunci, dsb.), dan melaksanakan sistem untuk mengurus berbilang tetingkap dan aplikasi.
Pada mulanya, GUI anda mungkin sangat asas – hanya satu tetingkap yang boleh berinteraksi dengan pengguna. Tetapi apabila OS anda semakin matang, anda perlu menambah ciri yang lebih maju seperti saiz semula tetingkap, fungsi seret dan lepas dan animasi.
Setelah anda menyediakan asas GUI, langkah seterusnya ialah membina sistem untuk mengurus tetingkap dan acara. Ini melibatkan pengendalian berbilang tetingkap serentak, setiap satu berpotensi menjalankan aplikasi yang berbeza dan memastikan setiap tetingkap menerima peristiwa input yang betul (seperti klik tetikus atau penekanan papan kekunci).
Anda juga perlu melaksanakan tetingkap perintah-z (tetingkap yang mana di atas), meminimumkan/memaksimumkan dan menyeret. Di sinilah keadaan mula berasa lebih seperti persekitaran desktop tradisional.
Untuk menjadikan GUI anda lebih berfungsi, anda perlu membina aplikasi asas, seperti apl Notepad. Apl Notepad ialah editor teks ringkas yang membolehkan pengguna menaip, mengedit dan menyimpan fail. Membina apl seperti ini melibatkan:
Ini adalah latihan yang hebat dalam menyusun segala-galanya: GUI anda, sistem fail anda dan pengendalian input anda semuanya dimainkan di sini. Sebaik sahaja anda mempunyai apl Notepad yang berfungsi, anda akan mempunyai asas OS yang berfungsi sepenuhnya.
Pada ketika ini, OS anda berfungsi, tetapi sentiasa ada butiran kecil yang membuatkannya terasa lebih gilap. Perkara seperti:
Setiap butiran kecil yang anda tambah mendekatkan OS anda kepada perasaan seperti sistem yang lengkap. Ia adalah proses yang panjang dan mencabar, tetapi pada akhirnya, anda akan mencipta sesuatu yang benar-benar unik - sistem pengendalian yang dibina dari awal.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!