1 puntos por GN⁺ 2024-07-16 | 1 comentarios | Compartir por WhatsApp
  • Las personas distinguen entre lo complejo y lo meramente complicado. La complejidad se considera interesante, pero lo complicado se considera dañino. El proceso de configuración de una CPU x86_64 es mayormente complicado.
  • Se explica cómo configurar la CPU desde modo real de 16 bits hasta modo largo de 64 bits desde un sector de arranque cargado por la BIOS. Esta configuración es básica y se necesita hacer más trabajo.
  • Se requiere el manual de desarrollador de software de arquitecturas Intel 64 e IA-32, un ensamblador (usando nasm) y QEMU. Debes conocer ensamblador x86 y la sintaxis de nasm.

Punto de partida: BIOS

  • Después del reinicio, una CPU x86 está en "modo real". Este modo tiene un tamaño de operando predeterminado de 16 bits. Puede direccionar 1 MB de memoria usando segmentación.
  • El primer código que se ejecuta después de la BIOS está en el sector de arranque. La BIOS busca el primer sector del sistema que termina en 0xaa55 y carga ese sector de arranque en la dirección de memoria 0x7c00.
  • La BIOS proporciona 512 bytes, y con ellos hay que hacer bootstrap del resto del bootloader.

Configuración del sector de arranque

  • Se configura un sector de arranque simple para mostrar un mensaje en pantalla usando rutinas de la BIOS y luego detenerse. Esto permite verificar que las herramientas funcionen.
  • Se configura el sector de arranque usando código ensamblador y un Makefile.

Paso 1 – Cargar la etapa 2 desde disco

  • El bootloader puede dividirse en dos etapas. La etapa 1 es el código del sector de arranque, es decir, todo lo que carga la BIOS. El único propósito de la etapa 1 es cargar la etapa 2 en memoria.
  • En la etapa 2 se cambia del modo real de 16 bits al modo protegido de 32 bits. En modo protegido no se pueden usar las rutinas de la BIOS. Cargar sectores desde disco se vuelve mucho más complejo.
  • Se explica cómo acceder al disco usando la BIOS.

Modo protegido de 32 bits

  • Se cambia la CPU de modo real (16 bits) a modo protegido (32 bits). En modo protegido, la segmentación se usa para implementar protección de memoria.
  • Antes de cambiar a modo protegido, se debe definir la tabla global de descriptores (GDT). La GDT se define como una estructura contigua en memoria.
  • Se explica cómo definir la GDT y cómo cambiar a modo protegido.

Modo largo de 64 bits

  • Antes de cambiar a modo largo, la CPU debe estar en modo protegido y la paginación debe estar activada. El modo protegido ya está configurado, pero se necesita paginación.
  • La paginación reemplaza a la segmentación para administrar el espacio de direcciones virtuales, permisos y más. Se explica cómo crear tablas de páginas para cambiar a modo largo.
  • Se define la GDT para el cambio a modo largo y se explica cómo pasar de modo protegido a modo largo.

Resumen de GN⁺

  • Este artículo explica en detalle el proceso de configurar una CPU x86_64 desde modo real de 16 bits hasta modo largo de 64 bits. Con ello, se puede mejorar la comprensión sobre bootloaders y el desarrollo de kernels de sistemas operativos.
  • Cubre varios conceptos como BIOS, sector de arranque, modo protegido y modo largo, y ofrece el código ensamblador y los métodos de configuración necesarios para cada etapa.
  • Este artículo es útil para quienes estén interesados en el desarrollo de sistemas operativos, especialmente porque ofrece una comprensión profunda de la arquitectura x86. Un proyecto con funcionalidad similar es "Writing a Simple Operating System – from Scratch".

1 comentarios

 
GN⁺ 2024-07-16
Comentarios en Hacker News
  • Hay una forma de cambiar a modo largo sin pasar directamente por modo protegido
    • Se creó un bootloader que carga un pequeño kernel de 64 bits en el sector de arranque
    • Incluye el proceso de cargar el kernel desde el disco y configurar el modo VESA
  • El 80286 tenía MSW, un registro de 16 bits, y el 80386 lo amplió a CR0 de 32 bits
    • El modo largo de 64 bits agregó el MSR EFER y amplió CR0 a 64 bits
    • Actualmente solo se usan 11 bits de CR0 y 8 bits de EFER
    • Se preguntan por qué Intel/AMD no usaron los bits vacíos de los registros existentes
  • La parte más innecesariamente compleja de este artículo es el Makefile y el script del linker
    • NASM puede generar salida binaria plana, pero al parecer consideran que usar eso es demasiado "hacky"
  • Todos los pasos necesarios para cambiar la CPU al modo correcto son innecesariamente complejos
    • Todo parece ser necesario por compatibilidad hacia atrás
    • Intel podría haber ofrecido desde el inicio una bandera o instrucción para arrancar directamente en el modo correcto
    • O podría haber eliminado toda la compatibilidad hacia atrás
    • Recuerdan haber investigado si ARM64 tiene un problema parecido
    • Se preguntan si existe alguna CPU diseñada como de 64 bits desde el principio
    • Ese probablemente habría sido el objetivo/diseño de Itanium
  • Puede haber defensores de UEFI que no entiendan por qué se creó un nuevo enfoque de bootloader
    • Como dice el autor, "si llegaste hasta aquí, es genial"
  • Se preguntan qué tan antiguo es UEFI
    • Es una lástima que no hayan retirado BIOS junto con el modo largo
  • Se preguntan si este procedimiento de arranque es compatible con EFI/UEFI
    • Se preguntan si el supervisor de UEFI emula modo real/modo protegido/modo largo en hardware real
  • Se preguntan si este proceso es más simple en ARM