Schreiben Sie sechs Monate lang Ihr eigenes funktionsfähiges Betriebssystem

Bild

Hintergrund


Hallo! Ich begrüße alle kategorisch. Heute möchte ich Ihnen über meine Erfahrungen beim Schreiben eines funktionsfähigen Betriebssystems für die x86-Architektur berichten.

Eines Frühlingsabends hatte ich eine brillante Idee: Versuchen Sie, Ihr eigenes Betriebssystem zu schreiben, mit dem Sie Programme ausführen, mit Geräten arbeiten und im Allgemeinen die gesamte Leistung der Intel-Architektur für Ihre Anforderungen nutzen können: zum Beispiel für Ihre Fabrik oder etwas anderes. Mein Ziel war und ist es, ein solches Betriebssystem zu schreiben, das maximale Leistung für bestimmte Aufgaben ermöglicht, ohne CPU-Zeit für alle möglichen Exzesse zu verschwenden. Ich verfolge hauptsächlich sportliches Interesse, sammle Erfahrungen in der Systemprogrammierung und schreibe Treiber für Geräte, die überall verwendet werden. Es liegt an Ihnen, zu entscheiden, was daraus wurde. Ich sage sofort, dass Sie keine Kommentare zum Erstellen Ihrer eigenen Linux-Distribution schreiben müssen. Ich war daran interessiert, alles von Grund auf neu zu schreiben - von Grund auf neu, um in das OSdev-Thema einzutauchen. Ich möchte Benjamin Lunt und dem OSDev-Forum sowie ihrem Wiki meinen tiefen Dank aussprechen. Ben hat mir geholfen, mit EHCI umzugehen, was zweifellos einen großen Beitrag zu meinem Betriebssystem geleistet hat - USB-Geräte, sie sind überall! Ich hatte auch die Aufgabe, meine eigene, für mich bequeme Architektur zu erstellen, ohne die Verwendung von ELF-Dateistandards auszuschließen. Kommen wir zum Punkt.
UPD: Alle Informationen finden Sie in der Tyk- Gruppe. Es gibt auch einen Beitrag mit Docks und einem Bild (alt, jetzt füge ich Docks für die stabile Version hinzu.)

Was wird gemacht?


Jetzt kann mein Betriebssystem mit USB-Sticks, Mäusen, Tastaturen, AHCI-Festplatten, PCI-IDE-Controller, APIC und ACPI arbeiten, das Verschieben von Multitasking wird implementiert, Programme werden gestartet, Streaming-Arbeit mit Dateien, SVGA-Treiber, der im 0x118-VBE-Modus funktioniert, DNS, DHCP, TCP, UPD, IPv4, HTTP, der vollständige FAT32-Treiber, der RTL8139 (69) -Treiber und Intel Gigabit Ethernet funktionieren.

Das Fenstersystem ermöglicht zusammen mit meiner Implementierung von SVGA die Erzeugung von bis zu 120 FPS bei vollständiger Neuzeichnung des Bildschirms. Lassen Sie uns fortfahren, wie dies alles implementiert ist und im Allgemeinen funktionieren kann.

Wie funktioniert es


Zu Beginn habe ich einen Bootloader geschrieben, der einen sekundären Bootloader mit einem Kernel mit FAT32 liest. Der zweite Bootloader wechselt in den geschützten Modus und springt zum Kernel, wo ich IDT lade und konfiguriere. Danach initialisiere ich die PCI-Geräte, starte die Kernel und starte CMD.

Jemand wird fragen, wie Sie mit SVGA eine solche Leistung erzielt haben. Die Antwort ist einfach: Assembler, Assembler und wieder Assembler. Nicht ohne SSE-Anweisungen, die das Kopieren des Speichers erheblich beschleunigen. Hier ist beispielsweise der Code zum Kopieren eines Videopuffers in 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'.


, , -, .

— - , - - , , ( , ) — , , .

!

Source: https://habr.com/ru/post/de426525/


All Articles