
Warnung! Fast nichts ist vollständig. Alles hier ist experimentell und in sehr aktiver Entwicklung. Vorsicht vorgehen.
Computer sind komisch . Seltsam in dem Sinne, dass sie sich magisch fühlen, wenn Sie nicht wissen, wie sie funktionieren. Wenn Sie lernen, wie es funktioniert, verschwindet dieses magische Gefühl. Sie werden entweder mit "Wow! Das ist Brillaint" oder "Wow ... das ist Scheiße".
Sie haben also im Grunde zwei Optionen:
Falls es noch nicht offensichtlich war, nahm ich letztere.
Grundsätzlich wollte ich mehr über "Computer" erfahren. Die Arbeit an der relativ hochrangigen Software macht ziemlich viel Spaß, aber ich habe die schlechte Angewohnheit, Praktikanten auf niedrige Ebene und Funktionen von Sachen zu betrachten.
"Oh, also meine Anrufe zu
malloc()VMAnewrufen dieTCRTLBmmap()MMU? LassenMAIRuns die Implementierung überprüfen.
Es gab diese Abstraktionsschichten , von denen ich keine Ahnung hatte! Ich hätte dort aufhören sollen, aber nein. Stattdessen sagte ich: "Okay. Ich mag das Aufruf des Löschengefühls von Sachen auf niedrigem Niveau. Und jetzt bin ich hier.
Arbeitenbetriebssystem /W "handgefertigte" Microkernel . Der Name stammt aus dem politischsten und durcheinandergebrachten Kontinent in der Welt von Game of Thrones. [^2] Ich mag es wirklich, dass ich (ja, beurteilen Sie mich alles, was Sie wollen) und die politische Unordnung, die es mit diesem Projekt ähnlich wie meine eigenen Ziele anfühlte. Alles ist überall und nichts macht Sinn.
Dieses Projekt existiert nur, um mir zu helfen, über Betriebssysteme zu lernen und unterwegs Spaß zu haben. Ich behaupte nicht, viel über OS -Entwicklung zu wissen. Die Praktiken, Design -Chocies und einige Implementierungen, die Sie hier sehen, werden Sie erschrecken.
Ich schlage vor, dass Sie Ihre Erwartungen niedrig>. <
Wichtiger Hinweis: Westeros befindet sich in einer sehr frühen Entwicklung. Sachen werden sich ändern, bremsen oder direkt dumm sein. Ich kann noch ein Endziel definieren. Bis dahin erwarten Sie überall alles auf einmal.
/dev und /proc (IDK, wenn dies möglich ist?)mkdir , touch & catLassen Sie uns ein bisschen mehr in die innere Arbeit von Dingen eintauchen. Die Zielmaschine ist sehr spezifisch und statisch . Ich wollte es so einfach wie möglich halten, indem ich nur die ARM64 -Architektur (ARMV8) und QEMUs Arm Virt Machine unterstütze.
Hier ist die Zielmaschine.

Nur die Muss grundlegenden Peripheriegeräte sind definiert. Leider bedeutet dies kein USB, NVME und NIC. :( Vielleicht in der Zukunft?
Hier sind die Peripheriegeräte, die ich unterstützen möchte .
Der Kernel folgt einem einfachen Mikrokernel-Design (wie der L4-Familie). Ich wollte einen einfachen Kernel erstellen, der leicht zu verstehen ist und mir beim Lernen während des Prozesses helfen ist.
Ich folgte zunächst dem XV6 des MIT. Als die Leute gefragt wurden, sagten mir die Leute, dass es ein bisschen zu "naiv/billig" sei und würde mir wahrscheinlich nicht helfen, IRL ( sie sind übrigens erstaunliche Leute ). Also beschloss ich, ihren Rat zu beziehen und ein Mikrokernel -Design zu machen. Es scheint auch interessanter zu sein.
Warnung! Mein handgemachtes Mikrokernel-Design auslöst Sie. Zum Beispiel stelle ich die Gerätefahrer in den Benutzerbereich und den Scheduler in den Kernelraum (im Grunde nicht wirklich einem "richtigen/acedemischen" Design).
Gib mir einfach etwas Zeit. Ich lerne immer noch, wenn ich gehe>. <
Hier ist ein Gesamtüberblick über den Kernel. (TODO: Wird bald aktualisiert ...)

TODO: Gesamtbetriebsspezifikationen. Was ist was und die zukünftigen Ziele.


|-- Build <- Compiled objects, binaries & debug files
|-- Documents <- Reference documents
|-- Emulation <- QEMU scripts & Device Tree Structure
|-- Kernel <- The source code. Headers, C and C++ files
| `-- Arch <- Architecture related code
| `-- Drivers <- Driver source and header files
| `-- Library <- Library source and header files
| `-- Include <- Kernel header files
|-- Media <- Images and other media
|-- Toolchain <- Cross-compiling environment
|-- Userland <- User level source code
| `-- Dir. <- TBD.
|-- .gitignore <- Good ol' .gitignore
|-- Makefile <- Makefile
`-- README.md <- Main README
Derzeit ist die einzige Möglichkeit, Westeros zu boottern, über den -kernel -Parameter von QEMUs AARCH64 VIRGE -Maschine.
Der Teil, der für den Start des Kernels (und damit das Betriebssystem) verantwortlich ist, heißt Shim. Es handelt sich um ein kleines Stück Code, das neben dem Kernel -Bild verknüpft ist und für das Bootstrapping des Systems verantwortlich ist.
Es geht einige Operationen aus, bevor der Kernel die Kontrolle übernimmt.
Referenz: SEL4 - Elfloader
Zustand der ARM64 -Maschine (z. B. Register) kurz vor kmain()
0xffff0000401080000x401010000x401020030x401020000x400007010x401030000x401040030x401040000x400007010xbbff440c04000b00000000 (DEVICE_nGnRnE)0b00000100 (DEVICE_nGnRE)0b00001100 (DEVICE_GRE)0b01000100 (NORMAL_NC)0b11111111 (NORMAL)0b10111011 (NORMAL_WT)0b00000000 (Res)0b00000000 (Res)0x4801000100b0 (48 bit)0b100 (44 bits, 16TB)0b01000 (16)0b01000 (16)0b0 (Hierarchical permissions enabled)0b0 (Hierarchical permissions enabled)0b0 (Top Byte used)0b0 (Top Byte used)0b0 (8 bit)0b0 (TTBR0_EL1.ASID defines the ASID)0b0 (Perform table walk)0b0 (Perform table walk)0b10 (4 KiB)0b00 (4 KiB)0b00 (Non-shareable)0b00 (Non-shareable)0b00 (Outer Non-cacheable)0b00 (Outer Non-cacheable)0b00 (Inner Non-cacheable)0b00 (Inner Non-cacheable)0x40101000 (k_l0_pgtbl)0x40103000 (u_l0_pgtbl)0xc508390b1 (MMU enabled)0b0 (Alignment fault checking is disabled)0b00b1 (SP Alignment check enabled)0b1 (SP Alignment check enabled for EL0)0b1 (System instruction memory barrier enabled for EL0 Aarch32)0b0 (Access to Stage 1 Normal memory from EL0 & EL1 are Stage 1 Non-cacheable)Westeros Kernel folgt einem Mikrokernel -Design. Unterschiedliche Personen/Orgs haben unterschiedliche Interpretationen darüber, wie ein Mikrokernel entworfen werden sollte (z. B. L4, Minix). Hier verwende ich den Begriff Micro als so einfach wie möglich. Das heisst:
Alle oben genannten müssten als Benutzer-Raum-Anwendungen implementiert werden.
Kernel bietet die folgenden Dienste und Funktionen an:
mmap() )msgsend() , msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() ) Der Kernel benötigt ein [initial] Benutzerbild vom Bootloader. Dieses Bild sollte die erste ausführbare Elfen enthalten, die der Kernel startet (wahrscheinlich die root task und der process manager ).
Das Anwendungsbild kann als in Linux -Systemen verwendet werden.
Die vollständige Liste von allem, was der Kernel bietet, und die Innenarbeit von Sachen wird später in der Straße erklärt. Ich muss sie noch implementieren .
Als Referenz habe ich die folgenden Microkernels & Oses stark verwendet:
TODO: Ein paar lustige Zeug. Was erwartet jemanden, den er das Betriebssystem starten?
Die folgenden Dienste sind implementiert:
services.config ) Um das Betriebssystem zu erstellen und auszuführen, benötigen Sie drei wichtigste Dinge: ARM GNU Toolchain , QEMU und ein wenig Geduld ™.
Es ist möglich, alles auf Ihrem Lieblingsbetriebssystem zu bauen. ARM GNU Toolchain ist sowohl unter Windows , MacOS als auch bei GNU/Linux verfügbar. Ich habe jedoch noch keine Fenster getestet. Sie sind also allein in diesem Raum. Entschuldigung :(
Die folgenden Schritte sind für GNU/Linux -Hosts (AARG64) .
0. Stellen Sie sicher, dass Sie git haben und make
$ apt install git make # if using `apt`
$ pacman -S git make # if using `pacman`1. Klonen Sie dieses Repository klonen
$ git clone https://github.com/TunaCici/WesterOS.git 2. Laden Sie den neuesten ARM GNU Toolchain herunter
Navigieren Sie zu ARM GNU Toolchain -Download -Webseite.
Wählen Sie das entsprechende AARG64 Bare-Matel-Ziel zum Herunterladen. Die Version sollte keine Rolle spielen. Wählen Sie also die neueste. Welche gehostete Toolchain, die Sie herunterladen, ist jedoch wichtig. Wählen Sie die für Ihr eigenes Betriebssystem erstellte.
Wenn Ihr Betriebssystem beispielsweise GNU/Linux (x86_64) ist, laden Sie herunter:
https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-elf.tar.xz
$ cd WesterOS/Toolchain
$ wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xzEs liegt in Ihrer Verantwortung, die "Integrität" und "Signatur" der heruntergeladenen Datei zu überprüfen. Verwenden Sie die SHA256 -Tasten auf der Seite Downloads.
3. Extrahieren Sie den heruntergeladenen ARM GNU Toolchain
Stellen Sie sicher, dass Sie es in Westeros/Toolchain extrahieren.
$ tar -xvf arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xz 4. Ändern Sie den TOOLCHAIN_PATH in der Makefile
Der TOOLCHAIN_PATH sollte auf Ihre neu heruntergeladene und extrahierte ARM GNU Toolchain verweisen. Da Ihre Host -Betriebssystem- und Toolchain -Version möglicherweise anders sein als meine, müssen Sie die Pfadvariable bearbeiten.
Wenn nicht korrekt eingestellt, fällt der make -Prozess mit einer Fehlermeldung wie folgt fehl:
make[1]: Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf/bin/aarch64-none-elf-as: No such file or directory
Stellen Sie also sicher, dass Sie den TOOLCHAIN_PATH bearbeiten.
# Open the main Makefile /w your favorite text editor
$ vim Makefile
# And change the `TOOLCHAIN_PATH` accordingly. For example..
> TOOLCHAIN_PATH=Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf
# Save & exit 5. bauen mit make
$ make allDer Build endet mit einer Meldung Build vollständig. Genieße das Leben <3 . Wenn Sie es nicht sehen, kontaktieren Sie mich. Ich werde das Problem versuchen, das Problem zu beheben>. <
Westeros kann nur mit QEMU ausgeführt werden. Ich habe keine Pläne, ein vollständig startbares Bild für die Hardware für reale Welt zu erstellen. Ursprünglich war meine Idee, einen Raspberrry Pi 4b zu emulieren, aber ich erkannte, dass es beim Testen und Deubging möglicherweise nicht "anfängerfreundlich" ist. Also, Qemu ist es!
Schamlose Steckerzeit! Wenn Sie mehr über QEMU wollen, besuchen Sie mein QEMU_Starter Github -Ding.
0. Stellen Sie qemu-system-aarch64
$ apt install qemu-system qemu-utils # if using `apt`
$ pacman -S qemu-full # if using `pacman`1. Starten Sie Westeros
$ make runAb dem 9. Juli 2023 sind die Westeros direkt leer! Sie können also nichts tun, als einige sehr grundlegende Kernel -Nachrichten auf dem Terminal zu sehen:/
Andererseits ist Westeros ein hobbyistisches Betriebssystem und ein Lernprozess . Sie sollten wirklich versuchen, den Quellcode zu erkunden. Ich bin sicher, Sie werden dort mehr Spaß haben.
TODO: Navigieren Sie durch den Benutzer zu einem anderen Readme, der im Grunde die Dokumentation ist.