operating-system - funcion - operating system from scratch
Código de inicialización del software en 0xFFFFFFF0H (2)
Intel dice que después del reinicio, el procesador se coloca en modo real y el código de inicialización del software comienza en 0xFFFFFFF0H. Mis preguntas:
Si el procesador está en modo real, ¿cómo puede acceder a la memoria> 1 MB (0xFFFFFFF0H)?
Cómo sucede esto o qué sucede cuando la memoria RAM en <4 GB (digamos 2 GB)
Si el BIOS está mapeado en 0x000FFFFFH, el procesador comienza a ejecutarse en 0xFFFFFFF0H
Por favor ayúdame con estas preguntas. Gracias.
Finalmente encontré la respuesta en la documentación de Coreboot :
Cada vez que una CPU x86 se despierta después del reinicio, lo hace en modo real. Este modo está limitado a un espacio de direcciones de 1MiB y compensaciones de 64k y el vector de reinicio del 8086/88 original estaba ubicado en 0xFFFF0.
Como no hubo cambios, incluso si ejecutamos procesadores actuales como P3, estas CPU más nuevas también parecen comenzar desde 0xF0000: 0xFFF0 después de un reinicio. Pero ellos no. La base del registro del segmento de código es 0xFFFF0000 después del restablecimiento, por lo que la CPU genera una dirección física de 0xFFFFFFF0 en el conjunto de chips. Y el chipset es responsable de reenviar esta área a la ROM de arranque. Es confuso: la CPU "piensa" que ejecuta código en 0xF000: 0xFFF0, pero en su lugar usa código en 0xFFFFFFF0. Los desarrolladores deben haber sido despedidos cuando se dieron cuenta de este diseño en silicio.
Por lo tanto, parece que la documentación de Intel habla de la dirección física utilizada "en el cable", es decir, cuando se accede al bus real. Y esto es independiente del modo de CPU (el bus no sabe o no le importa un modo de CPU, es tarea de la CPU traducir estas cosas).
Para ver su pregunta en acción, necesitará un depurador de hardware. Y la documentación adecuada es de Intel, para citar: http://download.intel.com/design/processor/manuals/253668.pdf , sección 9.1.4:
La primera instrucción que se obtiene y ejecuta después de un restablecimiento de hardware se encuentra en la dirección física FFFFFFF0H. Esta dirección está a 16 bytes por debajo de la dirección física más alta del procesador. La EPROM que contiene el código de inicialización del software debe estar ubicada en esta dirección.
Esto significa BIOS ROM, FYI, no su RAM normal, es decir, el contenido está cableado. Y recuerde, en esta etapa, la memoria RAM ni siquiera está configurada, y la memoria VGA (que es diferente de la RAM) ni siquiera está disponible e inicializada.
La dirección FFFFFFF0H está más allá del rango direccionable de 1 MByte del procesador mientras está en modo de dirección real. El procesador se inicializa a esta dirección de inicio de la siguiente manera. El registro CS tiene dos partes: la parte del selector de segmento visible y la parte de dirección de base oculta. En el modo de dirección real, la dirección base normalmente se forma desplazando el valor del selector de segmento de 16 bits 4 bits hacia la izquierda para producir una dirección base de 20 bits. Sin embargo, durante un restablecimiento de hardware, el selector de segmento en el registro CS se carga con F000H y la dirección base se carga con FFFF0000H. La dirección de inicio se forma añadiendo la dirección base al valor en el registro EIP (es decir, FFFF0000 + FFF0H = FFFFFFF0H). La primera vez que el registro CS se carga con un nuevo valor después de un restablecimiento de hardware, el procesador seguirá la regla normal para la traducción de direcciones en modo de dirección real (es decir, [dirección base CS = selector segmento CS * 16]). Para asegurar que la dirección base en el registro CS permanece sin cambios hasta que se complete el código de inicialización del software basado en EPROM, el código no debe contener un salto lejano o una llamada lejana o permitir que ocurra una interrupción (lo que provocaría el cambio del valor del selector CS )
Durante este tiempo, el BIOS esencialmente está inicializando el hardware y la memoria en sí, mientras todavía se ejecuta en modo real. Entonces, finalmente, el BIOS VGA (que existe en su tarjeta VGA, direccionable a 0xc700) se ejecuta, etc. etc. Pero esto va más allá de la pregunta actual. Pero los comentarios citados anteriormente esencialmente respondieron su pregunta.