#: Train-OS Una sesión de capacitación para construir un sistema operativo. Comenzando desde cero, solo usando recursos de AMD e Intel .
Todavía en el escenario alfa
Este repositorio aún no está pulido y aún tiene que ser considerado en la etapa alfa. El código debe compilar y funcionar, pero el mensaje de texto es solo el primer borrador que noté además mientras estaba codificando e investigando.
¿Qué es diferente a otros tutoriales?
Hay muchos tutoriales y una gran parte del material que presento también está cubierto allí. Entonces, ¿por qué molestarse? Me gusta especialmente y me inspiré:
- Phil Todo: Link
- InterMezzos: TODO: Link
¿Qué es diferente en esta versión? Cuando aprendo cosas nuevas, a menudo tengo la sensación de que no sé/aprendo cómo podría hacer lo que hice por completo solo la próxima vez. No sé si es la forma en que aprendo o simplemente una cosa típica que se omite fácilmente al escribir tutoriales. Aquí hay algunos puntos que me pregunto regularmente y que quiero abordar (probablemente me perderé otras cosas esenciales para compensarlo)
- Proporcione algunos detalles más sobre qué puntos son simplemente convenciones que se acordaron, qué es un estándar, qué es específica de la arquitectura. Todavía recuerdo cuando comencé a aprender programación cuando era adolescente, pensé "Uuhh ... ¿cómo sabe la computadora que la función principal debe llamarse primero", y ninguno de mis amigos o maestros nuevos? Era solo "magia". Estas cosas me molestan , quiero entender de dónde vienen las cosas ...
- Señale el estándar y trabaje desde allí. No presentaré una solución terminada que solo copie. Tomamos el estándar y en realidad buscamos las cosas . Tal como tendríamos que hacerlo si nos gustaría ejecutar el código en Digamos una corteza del brazo en lugar de su máquina x86_64. O, enmarcado de manera diferente, ¿qué pasaría si fueramos los primeros en escribir un tutorial, cómo poner en marcha ese cargador de arranque, las interrupciones configuradas o la CPU en modo de 64 bits en primer lugar?
- Haz cosas dos veces. Primero iré a los barebones, esto ayuda a comprender lo que está sucediendo y luego, usamos herramientas para evitar hacer ese trabajo en el suelo cada vez.
- Pasos intermedios y "puntos de control"
- Dé un esquema primero -> para ver la imagen más grande
- Dé ejemplos en código real,> por ejemplo, que el primer contenedor de kernel es en realidad exactamente cómo se construye Linux
- Presente alternativas/opciones para cada
dependency que comenzamos a usar. Para mí, es más liso si quiero seguir un tutorial y muchas bibliotecas externas hacen la magia que realmente quería aprender.
Describir
Un resumen aproximado de lo que quiero hacer. Con suerte, en un orden más o menos cronológico. El punto es que hay tanto que podríamos hacer que en realidad sea bastante difícil elegir un camino.
Primero, me gustaría comprender mejor el proceso de arranque. Lo que sucede antes de que el gestor de arranque salga. En realidad, rodando su propio gestor de arranque (enlace a OSDEV) es una gran tarea en sí misma.
Mi plan es explorar un poco la fase temprana en el proceso de arranque. El objetivo de eso es comprender y apreciar lo que un gestor de arranque está haciendo por nosotros. Al final, me gustaría tener una comprensión aproximada de los diferentes modos de procesador, lo que ofrecen y cómo cambiar al modo protegido de 32 bits. ¡El objetivo concreto es poder cambiar al modo protegido e imprimir Hello World! a la pantalla. Todo implementado en el ensamblaje y sin el uso de un cargador de arranque.
Después de eso, planeo cambiar y usar grub como cargador de arranque. Y continúa desde allí.
Tl; Dr
- Escribe una imagen mínima de arranque.
- Botero que imprime
Hello World en modo real de 16 bits. - Cambie manualmente al modo protegido de 32 bin e imprima
Hello World . - Cambie manualmente al modo de 64 binde
- Use grub como cargador de arranque e imprima
Hello World . - Cambie al modo largo (nuevamente).
- Salta a
C , imprime Hello World . - Pila
- Implementar el controlador de video VGA.
- Interrupciones (Parte 1) - Dígale a CPU dónde encontrar manejadores, en ASM
- Interrupciones (Parte 2) - Mueva el código de 10.
- Implementar mejores manejadores
- Depuración
- Manejar interrupciones/excepciones
- Implementar la paginación de memoria.
- Reasta
no especificado:
- refactorización?
- Utilidades (¿Memset?)
Luego...
- sistema de archivos
- procesos
- programación
- llamadas del sistema
- Explore la pila, provoca desbordamientos de pila y excepciones
- Conéctese con GDB a través de UART (para la depuración y la vista previa integrada)
- Compile cruzado algunas (o muchas) partes en un procesador ARM. (Tengo un tablero STM e Infineon que se encuentra sin usar)
¿Prerreques?
Ninguno. En serio, no te asustes. El objetivo de este tutorial es desarrollar todo el conocimiento requerido desde cero. Supongo que solo hay una condición, y es que puede programar de manera decente. Por decente quiero decir que al menos has oído hablar de la pila y el montón y puedes ser productivo en algún idioma. Supongo que eso debería ser suficiente. Después de todo, no estamos tratando de desarrollar el sistema operativo convencional de la próxima generación aquí, estamos jugando en un nivel de pasatiempo.
Y una cosa que puedo asegurarle: incluso si nunca volverá a tocar este código y nunca escribirá un sistema operativo. La experiencia cambiará su comprensión de los sistemas en los que está trabajando profundamente . El conocimiento adquirido al desarrollar a nivel de núcleo se extiende como semillas a lo largo de su carrera y las ideas resultarán útiles en los momentos más inesperados.
Scratchpad (ideas no organizadas de aquí en adelante)
Ideas
- ¿Qué hace la CPU si coloca instrucciones después de los primeros 512 bytes? ¿Están ejecutados? (La CPU está en modo real de 16 bits)
Describir
- Bootload -> Dos opciones rodan las suyas o use la comida existente, por ejemplo.
- Modo de 16 bits
- ingresar al modo protegido de 32 bits
- ingresando al modo de 64 bits largo
- Ingrese C
- Escribir el módulo de gerentes de memoria
Ciclo 0 - Mira de herramientas de entorno y compilación cruzada
- Puede omitir algunos de los pasos. No necesitaremos la CrossChaine de herramientas de compilación cruzada antes de comenzar a escribir el código C.
- Comience a construir su cadena de herramientas en algún lugar de menos de $
- Asegúrese de que el alcance de las variables de entorno sea correcto
- Errores como "No tenga permiso para crear Directorio
/usr/lib/i686-elf " indica que $PREFIX no está configurado correctamente. - No estamos obteniendo la CPU "Real" Barebones, todavía hay el BIOS que tenemos ante nosotros. Inicializa la CPU y nos entrega la CPU en modo real.
Ciclo 0 - Boot Loger
Recursos
- Documentación NASM https://www.nasm.us/xdoc/2.14.02/html/namdoc3.html
- Manuales de Intel