personalizar para gestor editar discos disco desde crear creador booteable arranque linux assembly nasm osdev dd

para - gestor de arranque linux



Crear una imagen ISO de arranque con un gestor de arranque personalizado (2)

Estoy tratando de convertir un gestor de arranque que escribí en Assembly Language en un archivo de imagen ISO . El siguiente es el código del gestor de arranque MikeOS . Aquí está mi código de cargador de arranque:

BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after this bootloader add ax, 288 ; (4096 + 512) / 16 bytes per paragraph mov ss, ax mov sp, 4096 mov ax, 07C0h ; Set data segment to where we''re loaded mov ds, ax mov si, text_string ; Put string position into SI call print_string ; Call our string-printing routine jmp $ ; Jump here - infinite loop! text_string db ''This is my cool new OS!'', 0 print_string: ; Routine: output string in SI to screen mov ah, 0Eh ; int 10h ''print char'' function .repeat: lodsb ; Get character from string cmp al, 0 je .done ; If char is zero, end of string int 10h ; Otherwise, print it jmp .repeat .done: ret times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s dw 0xAA55 ; The standard PC boot signature

Escribí el siguiente comando:

nasm -f bin -o boot.bin boot.asm

Este comando funciona bien y da una salida .bin. Luego escribí el siguiente comando:

dd if=boot.bin of=floppy.img count=1 bs=512

Esto también funcionó bien y me dio el archivo de salida .img. Cuando escribo este comando:

dd if=boot.bin of=floppy.img skip seek=1 count=1339

Me sale el siguiente error: dd: unrecognized operand ''skip'' . Leí en la documentación de DD que el atributo de omisión debe tener un número asignado. Cualquier idea qué número debo escribir con el atributo de omisión (por ejemplo, omisión = 1).

Luego escribo el siguiente comando:

mkdosfs -C floppy.img 1440

Me sale el siguiente error: mkdosfs: unable to create floppy.img . ¿Cómo soluciono los problemas que estoy enfrentando? ¿Hay alguna otra manera más fácil de convertir mi archivo .bin de cargador de arranque a una imagen ISO ?


Para CD; hay una especificación ("El Torito") que describe cómo funcionan los CD de arranque; donde los primeros 16 sectores (2048 bytes) no se utilizan, hay un "catálogo de inicio" que usa el firmware para decidir qué cargador de arranque debe usar (para que pueda tener un solo CD que arranque sistemas muy diferentes, p. ej. PC BIOS, UEFI , PowerPC, etc.), luego los cargadores de arranque sí mismos.

Para "PC BIOS" solo, hay 3 posibilidades:

  • emular un disquete (utilizando una "imagen de disquete" almacenada en el CD)
  • emular un disco duro (usando una "imagen de disco duro" almacenada en CD)
  • sin emulación

Las primeras 2 opciones son principalmente solo para fines compatibles (sistemas operativos viejos y crujientes que no admiten el arranque desde CD, como MS-DOS); y tiene implicaciones de rendimiento (por ejemplo, para emular la carga de un sector virtual de 512 bytes, el firmware tiene que cargar un sector real de 2048 bytes y descartar el exceso de 1536 bytes). Cualquier sistema operativo diseñado / escrito en los últimos 15 años debería estar utilizando "sin emulación".

Para "sin emulación":

  • El firmware carga todo el gestor de arranque (que puede ser de hasta aproximadamente 512 KiB) y no solo un sector
  • Los sectores en los CD son 2048 bytes (y no 512 bytes); y debe cargarse a través de. "int 0x13 extensions" (y no las antiguas / limitadas "funciones de disco CHS" que usarías para disquete)
  • No hay necesidad de un bloque de parámetros BIOS (que debe considerarse obligatorio para disquetes)
  • No hay necesidad de una tabla de particiones (que se debe considerar obligatoria para discos duros, incluido GPT)
  • Probablemente quiera soportar ISO9660 como el sistema de archivos (para encontrar el kernel y / u otros archivos que el cargador de arranque necesita cargar) y no FAT.

También tenga en cuenta que (en general) para "PC BIOS" es probable que desee 5 cargadores de arranque diferentes (uno para disquete, uno para disco duro "particionado MBR", uno para disco duro "particionado GPT", uno para CD, y uno para el arranque de red). Estos casos son todos lo suficientemente diferentes (y la limitación de "solo un sector inicial de 512 bytes" para 3 de estos casos es lo suficientemente restrictiva) como para hacer que la idea de "todos los dispositivos admitidos por un gestor de arranque" sea un desastre.

Para generar realmente el ISO; puede usar una herramienta existente (por ejemplo, mkisofs), o puede escribir su propia herramienta (ISO9660 y "El Torito" son relativamente fáciles de entender, y escribir su propia herramienta para generar un ISO se puede hacer en menos de 2 días, que es como una gota en el océano para proyectos de desarrollo del sistema operativo).


Parece que encontraste tu ejemplo para crear una imagen ISO de arranque a partir de esta respuesta de . Lamentablemente, eligió una respuesta aceptada que es incorrecta de muchas maneras. Pretenda que nunca vio esa respuesta.

En la mayoría de las distribuciones Linux, existe un programa llamado genisoimage o mkisofs . Estos días son en realidad el mismo programa. Cualquiera que sea tu puede ser sustituido en los ejemplos a continuación. Mis ejemplos supondrán que la utilidad de creación ISO se llama genisoimage .

En tu pregunta tienes un código de gestor de arranque en un archivo llamado boot.asm . Lo ensambla correctamente en una imagen binaria del sector de arranque con:

nasm -f bin -o boot.bin boot.asm

Esto crea boot.bin que es tu sector de arranque. El siguiente paso es crear una imagen de disquete y colocar boot.bin en el primer sector. Puedes hacer eso con esto:

dd if=/dev/zero of=floppy.img bs=1024 count=1440 dd if=boot.bin of=floppy.img seek=0 count=1 conv=notrunc

El primer comando simplemente hace una imagen de disco llena cero igual al tamaño de un disquete de 1.44MB (1024 * 1440 bytes). El segundo comando coloca boot.bin en el primer sector de floppy.img sin truncar el resto del archivo. seek=0 dice buscar al primer sector (512 bytes es el tamaño predeterminado de un bloque para DD ). count=1 especifica que solo queremos copiar 1 sector (512 bytes) de boot.bin . conv=notrunc dice que después de escribir en el archivo de salida, la imagen del disco restante debe permanecer intacta (no truncada).

Después de crear una imagen de disco como se muestra arriba, puede crear una imagen ISO con estos comandos:

mkdir iso cp floppy.img iso/ genisoimage -quiet -V ''MYOS'' -input-charset iso8859-1 -o myos.iso -b floppy.img -hide floppy.img iso/

Los comandos anteriores primero crean un subdirectorio llamado iso que contendrá los archivos que se colocarán en la imagen final del CD-ROM. El segundo comando no hace nada más que copiar nuestro floppy.img en el directorio iso porque lo necesitamos para el arranque. El tercer comando hace el trabajo pesado y construye la imagen ISO .

  • -V ''MYOS'' establece la etiqueta del volumen (Puede ser lo que quieras)
  • -input-charset iso8859-1 establece el conjunto de caracteres que se utiliza. No lo cambies
  • -o myos.iso dice que la imagen ISO se enviará al archivo myos.iso
  • -b floppy.img dice que nuestro ISO será de arranque y la imagen de arranque que se está utilizando es el archivo floppy.img
  • -hide floppy.img no es necesario, pero oculta la imagen de arranque de la lista del directorio final de ISO. Si floppy.img que montar este ISO y hacer un ls para listar los archivos, floppy.img no aparecería.
  • iso/ al final del comando es el directorio que se usará para construir la imagen ISO . Necesita al menos contener nuestra imagen de disquete de arranque, pero puede colocar cualquier otro archivo que desee en el directorio iso/ .

La imagen ISO myos.iso que se genera se puede iniciar. Un ejemplo del uso de QEMU para lanzar una imagen de este tipo:

qemu-system-i386 -cdrom ./myos.iso