Schreibe dein eigenes Betriebssystem für ein halbes Jahr

    Bild

    Vorgeschichte


    Hallo! Ich begrüße jeden herzlich, heute möchte ich Ihnen von meinen Erfahrungen beim Schreiben eines funktionsfähigen Betriebssystems für die x86-Architektur berichten.

    In einer Frühlingsnacht hatte ich eine geniale Idee. Versuchen Sie es selbst, indem Sie Ihr eigenes Betriebssystem schreiben. So können Sie Programme ausführen, mit Geräten arbeiten und generell die gesamte Leistung von Intels Architektur für Ihre Bedürfnisse ausnutzen: 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 verwenden. Grundsätzlich verfolge ich nur sportliche Interessen und sammle Erfahrungen mit der Systemprogrammierung und dem Schreiben von Treibern für Geräte, die überall verwendet werden. Was dabei herauskam, liegt bei Ihnen. Ich sage sofort, dass Sie keine Kommentare zum Erstellen Ihrer eigenen Linux-Distribution schreiben müssen und das Interesse verfolgt, alles von Grund auf neu zu schreiben - von Grund auf neu. um in das Thema OSDev einzutauchen. Ich möchte mich ganz herzlich bei Benjamin Lunt und dem OSDev-Forum sowie deren Wiki bedanken. Ben hat mir geholfen, mit EHCI umzugehen, was zweifellos einen großen Beitrag zu meinen OS-USB-Geräten leistete, sie sind überall! Ich war auch mit der Aufgabe konfrontiert, eine eigene Architektur zu erstellen, die für mich praktisch ist, und die Verwendung von ELF-Dateistandards nicht ausschließt.Nun, kommen wir zum Punkt.
    UPD: all das Alte kann in der Gruppe zu finden tyk , da es einen Beitrag der Docks und der Art und Weise (alte, heute wurde Docks für stable-Version Schlichten)

    Was wird gemacht


    Jetzt kann mein Betriebssystem mit USB-Flashlaufwerken, Mäusen, Tastaturen, AHCI-Festplatten, PCI-IDE-Controller, APIC und ACPI arbeiten. Das preemptive Multitasking ist implementiert, der Programmstart ist implementiert, die Arbeit mit Dateien wird optimiert, der SVB-Treiber wird im 0x118 VBE-Modus ausgeführt. DNS, DHCP, TCP, UPD, IPv4, HTTP, vollständiger FAT32-Treiber, RTL8139 (69) -Treiber und Intel Gigabit-Ethernet funktionieren.

    Das Fenstersystem zusammen mit meiner SVGA-Implementierung ermöglicht es, bis zu 120 FPS zu geben, wenn der Bildschirm vollständig neu gezeichnet wird. Lassen Sie uns darauf eingehen, wie dies alles implementiert ist und im Allgemeinen funktionieren kann.

    Wie funktioniert das?


    Zunächst schrieb ich einen Bootloader, der den sekundären Bootloader mit dem Kernel von FAT32 liest. Der zweite Bootloader wechselt in den geschützten Modus und springt zum Kernel. Dort lade und konfiguriere ich IDT, initialisiere 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: wieder Assembler, Assembler und Assembler. Nicht ohne SSE-Anweisungen, die das Kopieren von Speicher stark beschleunigen. Hier ist zum Beispiel der Code zum Kopieren des Videopuffers im LFB (Linear Frame Buffer):

    .byte 0x60#Save registers in stack
    mov %2,%%ecx 	#Repeat count to ecx
    mov %0,%%edi 	#Video memory startto edi
    mov %1,%%esi 	#Video buffer startto esi
    ww1sse2:
    	movaps  (%%esi),%%xmm0 #Copy16 bytes to xmm0 from buffer
    	movaps 	%%xmm0,(%%edi) #Copyfrom xmm0 to video memory
    	movaps  16(%%esi),%%xmm0	#16 again, but + 16fromcurrent
    	movaps 	%%xmm0,16(%%edi)	#16 again, but + 16fromcurrent
    	movaps  32(%%esi),%%xmm0	#16 again, but + 32fromcurrent
    	movaps 	%%xmm0,32(%%edi)	#16 again, but + 32fromcurrent
    	movaps  48(%%esi),%%xmm0	#16 again, but + 48fromcurrent
    	movaps 	%%xmm0,48(%%edi)	#16 again, but + 48fromcurrentadd$64,%%edi	#Add64 bytes to edi
    	add$64,%%esi	#Add64 bytes to esi
    	dec%%ecx#Decrement count
    	#test 	%%ecx,%%ecx #Compare ecx with zero
    	jnz 	ww1sse2 	#Ifnot zero, repeat again
    .byte 0x61	#Restore registers from stack
    

    Das Fenstersystem ist auf dem OOP aufgebaut und braucht meiner Meinung nach keine Kommentare, alles ist fast wie im Shinde.

    Der Speichermanager ist der einfachste - "Watermark Allocator". Die Ressourcenzuteilung erfolgt aufgrund der Tatsache, dass sich im Kernel keine Funktionen befinden, die sich gegenseitig beeinträchtigen könnten. Alle Anforderungen werden über Warteschlangen gestellt.

    Bisher gibt es keine E / A-Streams, die jedoch bald implementiert werden.
    Das logische Festplattensystem ähnelt MS-DOS: ein Buchstabe - eine Festplatte. Es werden sowohl MBR-Partitionen als auch GPT-Partitionen unterstützt.

    Gerätetreiberentwicklung


    Ohne das geht es nicht - es ist irgendwie unzivilisiert und unpraktisch, den Code eines anderen zu übernehmen. Wenn Sie die Linux-Repositories ausgraben, können Sie sich verlaufen.

    Um ehrlich zu sein, unterstütze ich die Tatsache, dass die Funktionalität des Programms die Hauptsache des Programms ist, aber gleichzeitig denke ich, dass es möglich ist, ein wenig Funktionalität für den Zeitplan zu opfern: zum Beispiel VIM.

    Natürlich war dies die interessanteste Entwicklungsphase: Tonnenweise Dokumentation zu lesen und dann zu verstehen, dass Sie die Rückgabe für das Debugging festlegen, weil der Teil der Struktur überhaupt nicht gefüllt ist. Ich denke, es ist gut genug, um das Gehirn zu belasten, denn auch nach dem zehnten Lesen der Docks bleiben einige Aspekte für Sie unverständlich, und Sie müssen lange mit realer Hardware debuggen.

    Debuggen


    Für das Debuggen des Betriebssystems ist viel Zeit erforderlich: Kompilieren Sie die Skalen, kopieren Sie sie auf eine virtuelle Festplatte, speichern Sie das Disk-Image, überprüfen Sie den Emulator, kopieren Sie die Dateien auf das USB-Flash-Laufwerk und überprüfen Sie die Hardware. Und am wichtigsten - keine Debugger, Ausgabe im Textmodus oder in den Fenstern - hing - put return'y.

    Ergebnisse


    Ja, das Betriebssystem befindet sich noch in der Entwicklungsphase, ich möchte eine stabile Beta-Version für das neue Jahr erhalten und werde mich in Zukunft vielleicht sogar auf einem ernsteren Niveau weiterentwickeln.

    Was ich am Ende sagen möchte - wenn jemand am OS-Entwicklungsthema interessiert ist oder etwas über die Arbeit mit Geräten und Schnittstellen lernen möchte, Implementierungs-Tricks oder einfach nur das Projekt unterstützen soll (nicht mit Geld, sondern mit Code), können Sie darüber schreiben Kommentare, alle Wünsche werden berücksichtigt und die Aspekte, die Sie interessieren, werden in Details und Farben beschrieben.

    Ethisches Hacking!

    Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte melden Sie sich an.

    Interessieren Sie sich für dieses Thema?


    Jetzt auch beliebt: