Sistema operativo basado en x86 construido desde cero para fines de aprendizaje
int 64 que ha requerido descriptores de puerta para la escalada de privilegiosPara construir un sistema operativo (suponiendo GCC, NASM instalado),
makeCorrer bajo QEMU
make qemuPara ejecutar (suponiendo bochs, bochs-sdl instalado),
make runCorrer bajo QEMU con soporte de depuración (GDB)
make qemu_gdb(Adjunte GDB, comandos requeridos ya proporcionados en el archivo .gdbinit en el Dir de nivel superior)
BIOS comienza el procesador en modo real de 16 bits, Grub inicia el modo protegido de 32 bits. La imagen de Kernel ELF está provista de encabezado Multiboot según la especificación de grub, si GRUB encuentra este encabezado en los primeros 512 bytes de imagen, luego carga ELF en la ubicación 0x100000, la memoria inferior pertenece a BIOS y otros mapeos de hardware/IO como VGA. Código de arranque, se ejecuta desde _start Entry Point of Kernel, y (la nota BSS ya está inicializada por grub),
El asignador de memoria de estrategia simple first-fit , asigna la memoria del espacio del núcleo, durante free también gestiona la compactación de bloques libres adyacentes.
Se proporcionan para el espacio de usuario Malloc/Free, que utilizó internamente la llamada del sistema sbrk para aumentar la ruptura del sistema (si es necesario). El kernel realiza la configuración de la tabla de página requerida y devuelve el límite de descanso del sistema.
Esto se divide en la asignación de memoria del espacio del núcleo y las asignaciones de memoria del espacio de usuario. Las asignaciones del espacio del núcleo permanecen constantes y son parte de cada espacio de direcciones de proceso, solo vinculados no clonados, ya que los cambios de un proceso en el espacio del núcleo también deberían ser visibles de otros procesos.
Las asignaciones de espacio de usuario dependen de la llamada exec , y cada proceso tiene su propio kernel y pila de usuarios.
Durante el interruptor de contexto, el registro CR3 se carga con la dirección base del directorio de la página del proceso actual y eso también invalida internamente TLB (buffer de traducción LookAside).
Las aplicaciones de espacio de usuario se almacenan en initramfs , un formato CPIO Archieve en formato ELF estándar. Durante la imagen exec Kernel halla y analiza, configura sus tablas de página en consecuencia. El proceso Init solo comienza shell y luego se queda allí para siempre.
El planificador se ejecuta en nombre del proceso de ejecución actualmente, principalmente en dos casos,
Los segmentos de código de modo/datos del kernel son separados que los segmentos de código de modo de usuario/segmentos de datos con niveles de privilegios programados en consecuencia. Al regresar de la excepción, el hardware aumenta CS (segmento de código) y SS (segmento de pila) desde la pila para volver a un nivel de privilegio más bajo.
Programamos este marco de pila en consecuencia mientras creamos nuevas tareas,
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;El hardware X86 tiene soporte incorporado para el cambio de tareas, básicamente cambiando de la pila de usuarios a la pila del núcleo junto con otros parámetros de segmentación. Para esto, cada tarea debe configurarse con su propio TSS, que se modifica durante el cambio de contexto. No utilizaremos el cambio de tareas de hardware, pero haremos lo mismo en el software mismo. En cualquier caso, necesitamos configurar un TSS en el extremo, que tenga el modo de núcleo válido SS (segmento de pila) y ESP (puntero de pila) para la tarea actual.
Preguntas frecuentes al azar
Siéntase libre de bifurcar y enviar solicitud de fusión