
Contexte
Bonjour Je souhaite la bienvenue à tout le monde, aujourd'hui je voudrais vous parler de mon expérience dans l'écriture d'un OS fonctionnel pour l'architecture x86.
Un soir de printemps, j'ai eu une idée géniale - essayer d'écrire votre propre système d'exploitation, qui peut vous permettre d'exécuter des programmes, de travailler avec des périphériques et, en général, de tirer toute la puissance de l'architecture d'Intel selon vos besoins: par exemple, pour votre usine ou autre chose. Mon objectif était et est d'écrire un tel système d'exploitation qui pourrait permettre des performances maximales pour certaines tâches spécifiques sans perdre de temps CPU sur toutes sortes d'excès. Je m'intéresse principalement au sport, acquérant de l'expérience par moi-même dans la programmation système et l'écriture de pilotes pour des appareils utilisés partout. C'est à vous de décider de ce qui en est ressorti, je dirai tout de suite que vous n'avez pas à écrire de commentaires sur la création de votre propre distribution Linux, et j'étais intéressé à tout écrire «From scratch» - from scratch, afin de plonger dans le thème OSdev. Je tiens à exprimer ma profonde gratitude à Benjamin Lunt et au forum OSDev, ainsi qu'à leur Wiki. Ben m'a aidé à gérer EHCI, qui a sans aucun doute apporté une énorme contribution à mon système d'exploitation - les périphériques USB, ils sont partout! J'ai également eu la tâche de créer ma propre architecture, pratique pour moi, sans exclure l'utilisation des normes de fichiers ELF.
Eh bien, allons droit au but.
UPD: toutes les informations se trouvent dans le groupe
tyk , il y a aussi un post avec des docks et une image (ancienne, maintenant
j'ajoute des docks pour la version stable)
Que fait-on?
Maintenant, mon système d'exploitation peut fonctionner avec des lecteurs flash USB, des souris, des claviers, des disques AHCI, un contrôleur PCI IDE, APIC et ACPI, le déplacement multitâche est mis en œuvre, des programmes sont lancés, des fichiers sont diffusés, le pilote SVGA fonctionne en mode VBE 0x118, DNS, DHCP, TCP, UPD, IPv4, HTTP, le pilote FAT32 complet, le pilote RTL8139 (69) et Intel Gigabit Ethernet fonctionnent.
Le système de fenêtres, associé à mon implémentation de SVGA, permet de produire jusqu'à 120 FPS avec une refonte complète de l'écran. Passons à la façon dont tout cela est mis en œuvre et peut généralement fonctionner.
Comment ça marche?
Pour commencer, j'ai écrit un chargeur de démarrage qui lit un chargeur de démarrage secondaire avec un noyau avec FAT32. Le deuxième chargeur de démarrage entre en mode protégé et passe au noyau, où je charge et configure IDT, après quoi j'initialise les périphériques PCI, démarre les noyaux et démarre CMD.
Quelqu'un vous demandera comment avez-vous réalisé une telle performance avec SVGA? La réponse est simple: assembleur, assembleur et assembleur à nouveau. Pas sans instructions SSE, qui accélèrent considérablement la copie de la mémoire. Par exemple, voici le code pour copier un buffer vidéo en LFB (Linear Frame Buffer):
.byte 0x60#Save registers in stack
mov %2,%%ecx #Repeat count to ecx
mov %0,%%edi #Video memory start to edi
mov %1,%%esi #Video buffer start to esi
ww1sse2:
movaps (%%esi),%%xmm0 #Copy 16 bytes to xmm0 from buffer
movaps %%xmm0,(%%edi) #Copy from xmm0 to video memory
movaps 16(%%esi),%%xmm0 #16 again, but + 16 from current
movaps %%xmm0,16(%%edi) #16 again, but + 16 from current
movaps 32(%%esi),%%xmm0 #16 again, but + 32 from current
movaps %%xmm0,32(%%edi) #16 again, but + 32 from current
movaps 48(%%esi),%%xmm0 #16 again, but + 48 from current
movaps %%xmm0,48(%%edi) #16 again, but + 48 from current
add $64,%%edi #Add 64 bytes to edi
add $64,%%esi #Add 64 bytes to esi
dec%%ecx#Decrement count
#test %%ecx,%%ecx #Compare ecx with zero
jnz ww1sse2 #If not zero, repeat again
.byte 0x61 #Restore registers from stack
, , , .
— «Watermark Allocator». , , , ..
-, .
MS-DOS: — . MBR , GPT .
— - , — .
, , — , , : , VIM.
, : , , return , - . , , - , .
: , , , , . — , , — — return'.
, , -, .
— - , - - , , ( , ) — , , .
!