Pregunta

Estoy escribiendo un cargador de arranque, y tengo la mayoría de los detalles, pero no estoy seguro de por qué algunos cargadores de arranque se reubican en la memoria antes de comenzar la mayor parte de su ejecución.

¿Alguien puede explicar esto?

Un ejemplo de este comportamiento es el v0.01 cargador de arranque del kernel de Linux original que tiene el siguiente comentario en él:

  

boot.s se carga a 0x7c00 por las rutinas de inicio de bios, y se aleja de la dirección 0x90000, y salta allí.

¿Fue útil?

Solución

Desde el artículo vinculado:

  

En la práctica, el MBR generalmente contiene un cargador de arranque cuyo propósito es cargar otro cargador de arranque, que se encuentra al inicio de una de las particiones. Este es a menudo un programa muy simple que encuentra la primera partición marcada como Activa, carga su primer sector en la RAM y comienza su ejecución. Dado que, por convención, el nuevo cargador de arranque también se carga en la dirección 7C00h, es posible que el cargador anterior deba reubicar todo o parte de sí mismo en una ubicación diferente antes de hacer esto. Además, se espera que ES: SI contenga la dirección en la memoria RAM de la tabla de particiones y DL el número de la unidad de inicio. La ruptura de tales convenciones puede hacer que un cargador de arranque sea incompatible con otros cargadores de arranque.

Otros consejos

CookieOfFortune es esencialmente correcto (porque quería mover algo al lugar donde estaba el cargador de arranque inicial), pero no fue para un segundo cargador de arranque, sino para el núcleo mismo.

De sus comentarios:

  

Luego carga el sistema a 0x10000,   utilizando interrupciones del BIOS. A partir de entonces   desactiva todas las interrupciones, mueve el   sistema hasta 0x0000, cambia a   modo protegido, y llama al inicio de   sistema. Sistema entonces debe   RE-inicializar el modo protegido en   Se trata de mesas propias, y habilitadas.   interrumpe según sea necesario.

Quiere que el kernel esté ubicado en 0x0000 ... 0xKERNEL_SIZE-1, sin embargo, el cargador de arranque inicial se encuentra actualmente en 0x7C00, por lo que si el kernel tuviera más de ~ 32 KB, sobrescribiría el bootloader a medida que lo movía. El hecho de que el núcleo esté ubicado en 0x0000 también explica este comentario:

  

" ¡NOTA! Actualmente el sistema está a lo sumo   8 * 65536 bytes de longitud. & Quot;

Si fuera superior a 512 KB a partir de 0, correría el riesgo de llegar al área reservada del espacio de direcciones x86.

Creo que esta sección de código contiene el salto real en el kernel

mov ax,#0x0001  | protected mode (PE) bit
lmsw    ax      | This is it!
jmpi    0,8     | jmp offset 0 of segment 8 (cs)

En ocasiones, el cargador de arranque está en la ROM y debe copiarse en la RAM en algún momento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top