Este es el primer sistema operativo que creé. Está escrito en dos idiomas: lenguaje c y ensamblaje.
Este proyecto se ha activado desde el 15 de diciembre de 2017

Plan de trabajo
Cargador de arranque
Costumbre
Sector de arranque
Etapa 2
COMIDA
Núcleo
Gestión de la memoria
Asignador de cuadro de página
Asignación de memoria dinámica
Sistema de construcción
Escribir texto a VGA
Interrupción de CPU (IDT, ISRS, IRQS, etc.)
Lea el carácter del teclado PS/2
Lea la cadena del teclado PS/2
Memoria virtual (paginación, marcos, etc.)
Asignación de cuadros de página y desactivación
Asignación de memoria dinámica (Libballoc)
Temporizador de la CPU
Obtener información de CPU
Reloj en tiempo real: para que podamos saber cuándo comienza la película
Rastro de pila de núcleo
Multitarea
Procesos en modo de usuario
Controlador de disco duro
Controlador de disco
Sistema de archivos
Interfaz gráfica de usuario
Este sistema operativo usa un gestor de arranque de 2 escasos. En caso de que la segunda etapa sea cuando ingresamos al modo protegido y llame al kernel.
Los primeros 512 bytes de mi imagen de disquete contienen el sector de arranque que hace muchas cosas que el modo protegido no puede hacer. (por ejemplo, cargando cosas del disco). Luego salta a la segunda etapa cargada a 0x7E00 (justo después del sector de arranque).
Esta etapa carga el GDT y entra en modo protegido , luego copia el núcleo cargado por el sector de arranque a 0x1000 a 0x100000 (1 MB). ¡En el último salto!
El tamaño del núcleo siempre está creciendo, pero no siempre puedo aumentar los sectores para cargar. Como una solución. Decido usar grub. El kernel se almacena como una imagen ELF ( kernel.img ) en un CD que utiliza ISO 9660 como su sistema de archivos. Grub también es compatible con Multiboot, por lo que mi sistema operativo puede funcionar junto con otros (Windows, Linux, etc.).
Entramos en modo protegido, lo que significa que no tenemos acceso a las funciones del BIOS. Por lo tanto, este núcleo necesita volver a implementar esas funciones para controlar el hardware.
Ahora, he vuelto a implementar dispositivos estándar: pantalla y teclado. En el desarrollo posterior. Voy a implementar el controlador de disco.
Este sistema operativo utiliza tanto la segmentación como la paginación para proporcionar protección de memoria. En mi tabla de descriptores globales , puse 5 descriptores de segmento:
Segmento nulo
Segmento de código para el kernel : el segmento donde pertenece mi código de kernel
Segmento de datos para el núcleo : el segmento donde pertenecen mis variables globales del kernel a
Segmento de código para el usuario : actualmente no usa
Segmento de datos para el usuario : igual que 4
También habilito la paginación. Ahora mapeé intencionalmente la cuarta página en la primera tabla de página a not-present y read-only , para que pueda generar una falla de página ejecutando bsod en la línea de comando de mi sistema operativo.

Este kernel proporciona un asignador de cuadro de página , por lo que la gestión de la memoria será más conveniente y será más fácil abordar la multitarea.
Como sugiere el tutorial de Jamesm, usaré un bitset para determinar si un marco es gratuito o no.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
Actualmente he implementado un malloc de colocación sin gratis porque todas las variables utilizadas por el kernel nunca necesitan ser liberadas hasta que se apague.
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
Debido a que soy vago, portaba un asignador de memoria de terceros llamado liballoc que solo requería pocas funciones en mi sistema operativo.
Este proyecto utiliza GNU Make to Build. Por lo tanto, la forma de construir es make , si se produce problemas durante la compilación, escriba make dep antes de make . Abra un problema si todavía está atascado.
Si no está utilizando Linux o WSL (subsistema de Windows para Linux), deberá descargar un compilador cruzado desde aquí. Luego modifique CC y LD en config.mk .