
¡Advertencia! Casi nada está completo todavía. Todo aquí es experimental y en un desarrollo muy activo. Proceder con precaución.
Las computadoras son raras . Extraño en el sentido de que se sienten mágicos si no sabes cómo funcionan. Si, y cuándo, comienzas a aprender cómo funciona, ese sentimiento mágico se desvanece. Terminarás con "¡Guau! Esto es brillante" o "wow ... esto es una mierda".
Entonces, tienes básicamente dos opciones:
En caso de que no fuera obvio todavía, tomé lo último.
Básicamente, quería aprender más sobre "computadoras". Trabajar en el software de nivel relativamente alto es bastante divertido, pero tengo la mala costumbre de terminar buscando internales de bajo nivel y funcionamiento de cosas.
"Oh, entonces mis llamadas a
malloc()ynewtermina llamando al syscallmmap()? Comprobemos su implementación ... oh, ¿qué esVMA? ¿Qué es unMMU? ¿Qué es unTLB? ¿Qué es elTCRy elMAIR?
¡Había estas capas de abstracción de las que no tenía idea! Debería haberme detenido allí, pero no. En cambio, dije: "Está bien. Realmente me gusta la sensación de llamada de bajo nivel. Y ahora, aquí estoy.
Sistema operativo de aficionados de trabajo en progreso /W Microkernel "hecho a mano" . El nombre es del continente más político y desordenado en el mundo de Game of Thrones. [^2] Realmente me gusta Got (sí, juzgame todo lo que quieras) y el desorden político se sintió similar a mis propios objetivos con este proyecto. Todo está por todas partes y nada tiene sentido.
Este proyecto existe solo para ayudarme a aprender sobre los sistemas operativos y divertirme en el camino. No pretendo saber mucho sobre el desarrollo del sistema operativo . Por lo tanto, las prácticas, el diseño de chocies y algunas implementaciones que ves aquí te asustarán.
Sugiero que Kepp sus expectativas bajas>. <
Nota importante: Westeros está en un desarrollo muy temprano . Las cosas cambiarán, los frenos o directamente serán estúpidos. Todavía tengo que definir un objetivo final. Hasta entonces, espere todo, en todas partes, todo a la vez.
/dev y /proc (IDK si esto es posible?)mkdir , touch & catVamos a sumergirnos un poco más en el funcionamiento interno de las cosas. La máquina de destino es muy específica y estática . Quería mantenerlo lo más simple posible soportando solo la arquitectura ARM64 (ARMV8) y la máquina ARM Virt de QEMU.
Aquí está la máquina de destino.

Solo se definen los periféricos básicos Must. Lamentablemente, esto significa que no hay USB, NVME y NIC. :( ¿Quizás en el futuro?
Aquí están los periféricos que planeo apoyar.
El núcleo sigue un diseño simple de microkernel (como la familia L4). Quería hacer un kernel simple que sea fácil de entender y ayudarme a aprender tanto como sea posible durante el proceso.
Inicialmente seguí el XV6 del MIT. Sin embargo, cuando se le preguntó, la gente me dijo que era demasiado "ingenuo/barato" y que probablemente no me ayudaría a IRL ( son personas increíbles por cierto ). Entonces, decidí seguir su consejo e ir con un diseño de microkernel. También parece más interesante oo
¡Advertencia! Mi diseño de microkernel hecho a mano te activará. Por ejemplo, puse los controladores de dispositivos en el espacio del usuario y el planificador dentro del espacio del núcleo (básicamente no sigue un diseño "adecuado/acedémico").
Solo dame algo de tiempo. Todavía estoy aprendiendo a medida que voy>. <
Aquí hay una descripción general del núcleo. (TODO: se actualizará pronto ...)

TODO: Especificaciones generales del sistema operativo. ¿Qué es qué y los objetivos futuros?


|-- 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
Actualmente, la única forma de arrancar Westeros es en la máquina AARCH64 Virt de QEMU a través del parámetro -kernel .
La parte responsable de lanzar el núcleo (y, por lo tanto, el sistema operativo) se llama cuña. Es una pequeña pieza de código vinculada junto con la imagen del núcleo y responsable de arrancar el sistema.
Maneja algunas operaciones antes de que el núcleo tome el control.
Referencia: SEL4 - Elfoader
Estado de la máquina ARM64 (por ejemplo, registros) justo antes de 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)El kernel de Westeros sigue un diseño de microkernel. Diferentes personas/organizaciones tienen diferentes interpretaciones sobre cómo se debe diseñar un microkernel (p. Ej., L4, Minix). Aquí uso el término micro como manteniendo el núcleo lo más simple posible. Esto significa:
Todo lo anterior debería implementarse como aplicaciones de espacio de usuario.
Kernel proporcionará los siguientes servicios y funciones:
mmap() )msgsend() , msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() ) El núcleo requiere una imagen de usuario [inicial] del cargador de arranque. Esta imagen debe contener los primeros ELF Ejecutables que el núcleo lanzará (probablemente la root task y el process manager ).
La imagen del usuario se puede considerar como el initrd utilizado en los sistemas Linux.
La lista completa de todo lo que proporciona el núcleo y el funcionamiento interno de las cosas se explicarán más adelante en el futuro. Todavía tengo que implementarlos .
Como referencia, hice un alto uso de los siguientes microkernels y sistemas operativos:
TODO: algunas cosas divertidas. ¿Qué espera a alguien que lanza el sistema operativo?
Se deben implementar los siguientes servicios:
services.config ) Para construir y ejecutar el sistema operativo, necesita tres cosas principales: ARM GNU Toolchain , QEMU y un poco de paciencia ™.
Es posible construir todo en su sistema operativo favorito. ARM GNU Toolchain está disponible en Windows , MacOS y GNU/Linux . Sin embargo, todavía no he probado Windows . Entonces, estás solo en ese espacio. Lo siento :(
Los pasos a continuación son para hosts GNU/Linux (AARCH64) .
0. Asegúrate de tener git y make
$ apt install git make # if using `apt`
$ pacman -S git make # if using `pacman`1. Clon este repositorio
$ git clone https://github.com/TunaCici/WesterOS.git 2. Descargue la última ARM GNU Toolchain
Navegue a la página web de descargas de cadena de herramientas GNU de GNU.
Elija el objetivo apropiado AARCH64 Bare Matel para descargar. La versión no debería importar, así que elija la última. Sin embargo, que la cadena de herramientas alojada que descarga sí importa. Elija el que se cree para su propio sistema operativo.
Por ejemplo, si su sistema operativo es GNU/Linux (x86_64), entonces usted descarga:
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 su responsabilidad verificar la "integridad" y la "firma" del archivo descargado. Use las teclas SHA256 proporcionadas en la página de descargas.
3. Extraiga la ARM GNU Toolchain descargado
Asegúrese de extraerlo mientras esté en Westeros/Toolchain .
$ tar -xvf arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xz 4. Modifique la TOOLCHAIN_PATH en el Makefile
TOOLCHAIN_PATH debe apuntar a su ARM GNU Toolchain recién descargado y extraído. Dado que su versión operativa de host y su versión de cadena de herramientas puede ser diferente a la mía, debe editar la variable de ruta.
Si no se establece correctamente, el proceso make fallará con un mensaje de error como:
make[1]: Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf/bin/aarch64-none-elf-as: No such file or directory
Por lo tanto, asegúrese de editar la 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. construir usando make
$ make allLa compilación termina con una compilación de mensaje completa. Disfruta la vida <3 . Si no lo ves, contáctame. Intentaré solucionar el problema>. <
Westeros solo se puede ejecutar usando QEMU. No tengo planes de hacer una imagen totalmente bloqueable para el hardware del mundo real. Originalmente, mi idea era emular un Raspberrry Pi 4B , pero me di cuenta de que podría no ser "amigable para principiantes" cuando se prueba y se desembelaba. Entonces, qemu lo es!
¡Tiempo de enchufe desvergonzado! Si desea más sobre QEMU, visite mi themu_starter Github Thingy.
0. Asegúrese de tener qemu-system-aarch64 instalado
$ apt install qemu-system qemu-utils # if using `apt`
$ pacman -S qemu-full # if using `pacman`1. Lanzar Westeros
$ make run¡Hasta el 9 de julio de 2023, el Westeros está sencillo vacío! Por lo tanto, no puede hacer nada excepto para ver algunos mensajes de núcleo muy básicos en el terminal:/
Por otra parte, Westeros es un sistema operativo aficionado y un proceso de aprendizaje . Realmente deberías intentar explorar su código fuente. Estoy seguro de que te divertirás más allí.
TODO: Navegue al usuario a otro ReadMe que es básicamente la documentación.