Tengo dificultades para entender cómo funciona un gestor de arranque simple. El gestor de arranque del que estoy hablando es el del curso de MIT "Ingeniería de sistemas operativos".gestor de arranque - conmutando el procesador al modo protegido
En primer lugar, permítame mostrarle un pedazo de código ensamblador el BIOS ejecuta:
[f000:fec3] 0xffec3: lidtw %cs:0x7908
[f000:fec9] 0xffec9: lgdtw %cs:0x7948
[f000:fecf] 0xffecf: mov %cr0,%eax
[f000:fed2] 0xffed2: or $0x1,%eax
[f000:fed6] 0xffed6: mov %eax,%cr0
[f000:fed9] 0xffed9: ljmpl $0x8,$0xffee1
Desde el aspecto de la misma, este código configura la tabla de interrupciones y de la tabla de descriptores y luego se activa el modo protegido .
- ¿Por qué entramos en el modo protegido en el BIOS? En caso de que no la gestor de arranque se ejecute en modo real (por cierto - ¿Por qué necesita para funcionar en modo real ?)
- he buscado, pero no encontró ninguna parte exactamente cómo la instrucción ljmpl obras, y es la diferencia entre y ljmp y jmp regular - I agradecería si alguien fuera apunta en la dirección correcta.
- ¿Por qué realizamos el salto? ¿Cuál es el propósito de esta instrucción?
Pasando al código del gestor de arranque -
# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt gdtdesc
movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %eax, %cr0
# Jump to next instruction, but in 32-bit code segment.
# Switches processor into 32-bit mode.
ljmp $PROT_MODE_CSEG, $protcseg
- Se dice que el procesador está en el modo real - pero sólo vio que el interruptores de BIOS al modo protegido ... Estoy confundido, ¿cómo puede ser ?
- ¿Cómo cambiamos al modo de 32 bits? ¿Qué hace que el procesador vaya mágicamente a en modo de 32 bits debido a la instrucción ljmp ?
Y otra cosa que no entiendo - cuando el seguimiento de la ejecución del gestor de arranque con gdb veo que se ejecuta la siguiente instrucción (que es la instrucción LJMP a partir del código del gestor de arranque):
ljmp $0x8,$0x7c32
Pero cuando miré en el archivo asm vi lo siguiente:
ljmp $0xb866,$0x87c32
totalmente perdido aquí - ¿Cómo es que la instrucción escrito en el archivo asm y la instrucción ejecutada son diferentes? Tengo la corazonada de que esto tiene que ver con el modo protegido y la forma en que traduce las direcciones, pero realmente no lo entiendo.
¡Agradecería cualquier ayuda!
Votación para cerrar como demasiado amplia: demasiadas preguntas en una. –