Saltar al contenido

¿Debo hacer mi propio sistema operativo kernel ELF o binario sin formato?

Posterior a consultar expertos en el tema, programadores de deferentes áreas y maestros dimos con la solución al dilema y la compartimos en este post.

Solución:

Debatí si debería sumergirme en una pregunta amplia que lleva a respuestas de opinión. Normalmente votaría para cerrar una pregunta como esta, pero en este caso voy a ofrecer una respuesta que podría ser beneficiosa para otros. Si preguntas ¿Por qué? Lo estoy haciendo por esta pregunta: la historia ha demostrado en Stackoverflow que esta pregunta a menudo se hace indirectamente como parte de una pregunta de desarrollo de sistema operativo más específica.


¿Algunas ventajas de ELF para un kernel?

  • La información de depuración se puede incrustar en el objeto.
  • Un cargador ELF puede configurar la imagen en la memoria, poner a cero el BSS sección automáticamente, etc.
  • Los datos globales no inicializados o inicializados en cero no ocupan espacio dentro de la imagen.
  • Los cargadores de arranque compatibles con arranque múltiple (como GRUB) pueden cargar ejecutables ELF diseñados correctamente
  • Se puede diseñar para ser reubicable.

¿Desventajas?

  • Los encabezados ELF se colocan al principio del ejecutable, lo que puede interferir con el entorno de destino previsto en el que se ejecutará el ejecutable (como los cargadores de arranque)
  • Para programas pequeños, los encabezados ELF pueden ser demasiado grandes para algunos usos (cargadores de arranque)
  • Requiere código (cargador ELF mínimo) para iniciar un ejecutable en la memoria y comenzar a ejecutarlo.

¿Por qué no usamos ELF para una imagen final del sector de arranque (MBR)?

La razón principal es que el formato ELF coloca información del encabezado antes del código. Los BIOS heredados (no EFI) no lo entenderán y comenzarán a ejecutar la información del encabezado como código.


¿Puedes usar imágenes ELF para depurar un gestor de arranque de 16 bits?

Depende del entorno y del depurador. con control remoto BGF depurando en QEMU esto es muy posible. Puede generar un ejecutable en modo real de 16 bits en un ensamblador como NASM/GAS etc como un objeto ELF (con Enano información de depuración), vincúlelo a un ejecutable ELF final y luego use un programa como objcopiar para eliminar los encabezados ELF para generar el binario plano final.

¿Por qué molestarse en generar objetos ELF para un cargador de arranque si lo reduce a un binario plano de todos modos?

Aunque un binario simplificado se ejecutará en el entorno de destino, un entorno con capacidades de depuración remota como QEMU puede usar un binario ELF local para resolver nombres de variables, etiquetas, constantes y permitir que se navegue la fuente original (no solo el ensamblaje sin procesar).

¿Puede proporcionar un ejemplo de esta técnica para la depuración de 16 bits?

Sí, este tipo de problema ha surgido antes. He proporcionado respuestas que muestran cómo hacer esto con los servicios de depuración remota de BGF y el depurador remoto en QEMU . Un ejemplo de este tipo se puede encontrar en esta respuesta de StackOverflow. El ejemplo es un gestor de arranque de muestra de 16 bits que se puede depurar con BGF. La depuración de 16 bits es problemática con BGF ya que no comprende los pares segmento:desplazamiento en código de 16 bits. Se proporciona un enlace a un script que ayuda en ese sentido, junto con un ejemplo. QEMU uso.


¿Hay alguna ventaja para el ejecutable ELF cuando se usa con un cargador de arranque múltiple?

¡Sí! Una gran ventaja para los cargadores de arranque compatibles con Multiboot como COMIDA es que entiende DUENDE imágenes Si está escribiendo un kernel en modo protegido y utiliza un ejecutable compatible con arranque múltiple construido correctamente para su kernel, puede ahorrar en la monotonía (en sistemas x86) de configurar el entorno en modo protegido, habilitar A20 Gate y obtener un mapa de memoria. , e inicializando el modo de modo de video de inicio.

¿QEMU puede lanzar directamente un ejecutable de kernel ELF compatible con Multiboot?

Sí, con la línea de comando adecuada usando el -kernel opción es posible. OS Dev Wiki tiene un ejemplo.

¿Puedes depurar el modo protegido de 32 bits usando binarios ELF con información de depuración?

Sí, esto es más simple que hacerlo para cargadores de arranque de 16 bits que se ejecutan en modo real. Ofrezco un ejemplo de esta técnica en esta respuesta de StackOverflow. Aunque la técnica es para QEMU utilizando una imagen ISO, alternativamente puede cargar QEMU con su kernel de arranque múltiple directamente usando el -kernel opción.


¿Por qué las versiones modernas de Linux usan el formato ELF para el Kernel?

En los días antiguos del desarrollo de Linux, Linux tenía su propio cargador de arranque, configuraba el modo protegido, habilitaba la puerta A20, etc. Este proceso es diferente según la arquitectura. Llegó un punto en el que los desarrolladores del kernel de Linux optaron por dejar ese trabajo en manos de un gestor de arranque de terceros.

En los sistemas de escritorio modernos encontrará COMIDA utilizado como cargador Muliboot; ELILO puede ser usado; en algunos sistemas embebidos arranque en U se convirtió en un gestor de arranque de elección. La especificación Multiboot surgió de la necesidad de iniciar un kernel de Linux, pero independientemente del sistema operativo. Muchos ejemplos de kernel de juguete en Internet están codificados para usarse como ejecutables ELF para que puedan aprovechar lo que ofrecen los cargadores de arranque compatibles con Multiboot.

Puede encontrar más información sobre la especificación de arranque múltiple en la documentación de GRUB

Al final de la web puedes encontrar las explicaciones de otros administradores, tú todavía tienes la habilidad mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *