
Avertissement! Presque rien n'est encore complet. Tout ici est expérimental et en développement très actif. Procéder à la prudence.
Les ordinateurs sont bizarres . Bizarre dans le sens où ils se sentent magiques si vous ne savez pas comment ils fonctionnent. Si, et quand, vous commencez à apprendre comment cela fonctionne, ce sentiment magique s'estompe. Vous vous retrouverez avec "Wow! C'est Brillaint" ou "Wow ... c'est de la merde."
Vous avez donc essentiellement deux options:
Au cas où ce n'était pas encore évident, j'ai pris ce dernier.
Fondamentalement, je voulais en savoir plus sur les "ordinateurs". Travailler sur le logiciel relativement élevé est assez amusant, mais j'ai la mauvaise habitude de finir par regarder les internels de bas niveau et le fonctionnement de choses.
"Oh, donc mes appels à
malloc()etnewfinissent par appeler le syscallmmap()? Vérifions son implémentation .. Oh, qu'est-ce queVMA? Qu'est-ceTCRMMU? Qu'est-ceMAIRTLB?
Il y avait ces couches d' abstraction dont je n'avais aucune idée! J'aurais dû m'arrêter là, mais non. Au lieu de cela, j'ai dit: "D'accord. J'aime vraiment le sentiment d'appel des choses de bas niveau. Allons à l'état sauvage et essayons d'apprendre toutes les abstractions en écrivant un système d'exploitation" simple ". Qu'est-ce qui pourrait mal tourner?" Et maintenant, me voici.
Système d'exploitation amateur de travail en cours / MICROKERNEL «MADIFICATION» . Le nom vient du continent le plus politique et le plus foiré dans le monde de Game of Thrones. [^ 2] J'aime vraiment avoir (ouais, jugez-moi tout ce que vous voulez) et le désordre politique de cela ressemblait à mes propres objectifs avec ce projet. Tout est partout et rien n'a de sens.
Ce projet existe uniquement pour m'aider à découvrir les systèmes d'exploitation et à m'amuser en cours de route. Je ne prétends pas en savoir beaucoup sur le développement du système d'exploitation . Ainsi, les pratiques, les colocations de conception et certaines implémentations que vous voyez ici vous feront peur.
Je suggère à Kepp vos attentes bas>. <
Remarque importante: Westeros est en développement très précoce . Les choses changeront, freinent ou serviront la ligne. Je n'ai pas encore défini un objectif final. Jusque-là, attendez-vous à tout, partout, à la fois.
/dev et /proc (idk si cela est possible?)mkdir , touch & catPlongeons un peu plus dans le fonctionnement intérieur des choses. La machine cible est très spécifique et statique . Je voulais le garder aussi simple que possible en prenant en charge uniquement l'architecture ARM64 (ARMV8) et la machine à verrouillage ARM de Qemu.
Voici la machine cible.

Seuls les périphériques de base incontournables sont définis. Malheureusement, cela signifie pas USB, NVME et NIC. :( Peut-être à l'avenir?
Voici les périphériques que je prévois de soutenir.
Le noyau suit une conception de micro-aumineuse simple (comme la famille L4). Je voulais faire un simple noyau facile à comprendre et m'aider à apprendre autant que possible pendant le processus.
J'ai d'abord suivi le XV6 du MIT. Cependant, lorsqu'on lui a demandé, les gens m'ont dit que c'était un peu trop "naïf / bon marché" et ne m'aiderait probablement pas IRL ( ce sont des gens incroyables btw ). J'ai donc décidé de suivre leurs conseils et de suivre une conception de micro-parcelles. il semble aussi plus intéressant oo
Avertissement! Ma conception de micro-verte fait à la main vous déclenchera. Par exemple, je mets les pilotes de l'appareil dans l'espace utilisateur et le planificateur à l'intérieur de l'espace du noyau (essentiellement ne suivant pas vraiment une conception "appropriée / accémique").
Donnez-moi juste du temps. J'apprends toujours au fur et à mesure que je vais>. <
Voici un aperçu global du noyau. (Todo: sera mis à jour bientôt ...)

TODO: Spécifications globales du système d'exploitation. Quels sont les objectifs et les futurs objectifs.


|-- 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
Actuellement, la seule façon de démarrer Westeros est sur la machine Virat Aarch64 de Qemu via le paramètre -kernel .
La partie responsable du lancement du noyau (et donc du système d'exploitation) est appelée cale. Il s'agit d'un petit morceau de code lié à côté de l'image du noyau et responsable de l'amorçage du système.
Il gère certaines opérations avant que le noyau ne prenne le contrôle.
Référence: Sel4 - Elfloader
État de la machine ARM64 (par exemple, registres) juste avant 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)Le noyau Westeros suit une conception de micro-nés. Différentes personnes / organes ont des interprétations différentes sur la façon dont un micro-noyau doit être conçu (par exemple, L4, Minix). Ici, j'utilise le terme micro comme gardant le noyau aussi simple que possible. Cela signifie:
Tout ce qui précède devait être implémenté en tant qu'applications d'espace utilisateur.
Le noyau fournira les services et fonctions suivants:
mmap() )msgsend() , msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() ) Le noyau nécessite une image utilisateur [initiale] du chargeur de démarrage. Cette image doit contenir le premier exécutable ELF que le noyau lancera (probablement la root task et le process manager ).
L'image Useer peut être considérée comme l'initiation utilisée dans les systèmes Linux.
La liste complète de tout ce que fournit le noyau et le fonctionnement intérieur de choses seront expliqués plus tard sur la route. Je ne les implémente pas encore.
En ce qui concerne la référence, j'ai fait un usage élevé des microkernels et des oss:
TODO: Des trucs amusants. Qu'est-ce qui attend quelqu'un qu'il lance le système d'exploitation?
Les services suivants doivent être mis en œuvre:
services.config ) Pour construire et exécuter le système d'exploitation, vous avez besoin de trois choses principales: ARM GNU Toolchain , QEMU et un peu de patience ™.
Il est possible de tout construire sur votre système d'exploitation préféré. ARM GNU Toolchain est disponible sur Windows , MacOS et GNU / Linux . Cependant, je n'ai pas encore testé Windows . Donc, vous êtes seul dans cet espace. Désolé :(
Les étapes ci-dessous sont pour les hôtes GNU / Linux (AARCH64) .
0. Assurez-vous d'avoir git et make
$ apt install git make # if using `apt`
$ pacman -S git make # if using `pacman`1. Clone ce référentiel
$ git clone https://github.com/TunaCici/WesterOS.git 2. Téléchargez la dernière ARM GNU Toolchain
Accédez à la page Web des téléchargements de chaîne d'outils ARM GNU.
Choisissez la cible AARCH64 AARCH64 appropriée à télécharger. La version n'a pas d'importance, alors choisissez la dernière. Cependant, quelle chaîne d'outils hébergée que vous téléchargez est importante. Choisissez celui qui est créé pour votre propre système d'exploitation.
Par exemple, si votre système d'exploitation est GNU / Linux (x86_64) , vous téléchargez:
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.xzIl est de votre responsabilité de vérifier «l'intégrité» et la «signature» du fichier téléchargé. Utilisez les clés SHA256 fournies dans la page de téléchargements.
3. Extraire la ARM GNU Toolchain téléchargé
Assurez-vous de l'extraire dans Westeros/Toolchain .
$ tar -xvf arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xz 4. Modifier la TOOLCHAIN_PATH dans le Makefile
La TOOLCHAIN_PATH doit pointer vers votre ARM GNU Toolchain nouvellement téléchargée et extraite. Étant donné que votre version hôte et votre version de la chaîne d'outils peut être différente de la mienne, vous devez modifier la variable de chemin.
S'il n'est pas réglé correctement, le processus make échouera avec un message d'erreur comme:
make[1]: Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf/bin/aarch64-none-elf-as: No such file or directory
Assurez-vous donc de modifier le TOOLCHAIN_PATH .
# 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. Construire en make
$ make allLa construction se termine par une version de message complète. Profitez de la vie <3 . Si vous ne le voyez pas, contactez-moi. Je vais essayer le résolution du problème>. <
Westeros ne peut être exécuté qu'à l'aide de Qemu. Je n'ai pas l'intention de créer une image entièrement bootable pour le matériel réel. À l'origine, mon idée était d'imiter un Raspberrry Pi 4B , mais j'ai réalisé que ce n'était peut-être pas «convivial pour les débutants» lors des tests et de la désubgage. Alors, Qemu c'est!
Temps de prise sans vergogne! Si vous en voulez plus sur Qemu, visitez mon truc de github Qemu_Starter.
0. Assurez-vous que qemu-system-aarch64 a installé
$ apt install qemu-system qemu-utils # if using `apt`
$ pacman -S qemu-full # if using `pacman`1. Lance Westeros
$ make runAu 9 juillet 2023, le Westeros est vide directement! Ainsi, vous ne pouvez rien faire sauf pour voir des messages de noyau très basiques sur le terminal: /
Là encore, Westeros est un système d'exploitation amateur et un processus d'apprentissage . Vous devriez vraiment essayer d'explorer son code source. Je suis sûr que vous vous amuserez là-bas.
TODO: naviguez par l'utilisateur vers un autre réadme qui est essentiellement la documentation.