4.98 segundos después de presionar el botón de encendido

Este artículo solo explica la siguiente pregunta:

¿Qué sucedió en los pocos segundos después de que presionamos el botón de encendido?

Esta parece ser una pregunta que mucha gente quiere entender, pero lo que me hace preguntarme: ¿Por qué no puedo encontrar una respuesta a una pregunta que parece tan simple?

La mayoría de las descripciones que encontré son así:

Según la "secuencia de arranque", el BIOS transfiere el control al dispositivo de almacenamiento que ocupa el primer lugar: el disco duro. Luego busque la partición del registro de inicio maestro en el disco duro. Esta partición le dice a la computadora dónde está el sistema operativo y carga el sistema operativo en la memoria. Luego puede ver la interfaz de inicio clásica y el proceso de inicio está completo.

Esta descripción es simplemente mágica, ¿por qué la BIOS domina todo esto? ¿Cómo llamarlo en el orden de activación ? Esta partición se carga en la memoria y luego, ¿cómo le dice a la computadora dónde está el sistema operativo? No soporto una descripción tan mágica, tengo que dejarlo claro.

Para aprender algo primero, debes tener un conocimiento previo . Lo tratamos como uno conocido. No puedo comenzar con el principio de formar moléculas a partir de átomos.

¿Cuál es el conocimiento previo para aprender el proceso de inicio de la computadora? Espero que sepas lo siguiente:

  1. La memoria es un lugar donde se almacenan los datos, dada una señal de dirección, la memoria puede devolver los datos correspondientes a la dirección.

  2. La forma en que funciona la CPU es buscar constantemente instrucciones de la memoria y ejecutarlas.

  3. La dirección en la memoria de la que obtiene la CPU está determinada por el valor en un registro, este valor continuará realizando operaciones +1, o una instrucción de salto especifica su valor.

Bueno, solo necesita conocer estos tres conocimientos previos y puede explicar profesionalmente el proceso de inicio de la computadora.

1. ¿Por qué está dominada la BIOS?

Se dice que después del arranque, el BIOS comenzará a ejecutar su propio programa, realizará una autocomprobación del hardware y cargará el área de arranque. No estoy satisfecho ¿Por qué se ejecuta el programa en el BIOS después de arrancar? ¿Por qué no está en la memoria? ¿Por qué no está en el disco duro?

De acuerdo, no dude del conocimiento previo, el método de trabajo de la CPU es buscar constantemente instrucciones de la memoria y ejecutarlas, entonces, ¿por qué se dice que ejecute los programas en la BIOS? Esto tiene que hablar de mapeo de memoria .

Dos, mapeo de memoria

El ancho del bus de direcciones de la CPU determina el tamaño del espacio de memoria accesible . Por ejemplo, el ancho del bus de direcciones de la CPU de 16 bits es de 20 bits y el rango de direcciones es de 1M. El ancho del bus de direcciones de la CPU de 32 bits es de 32 bits y el rango de direcciones es 4G. Puede calcular el rango de direcciones de nuestra máquina actual de 64 bits.

Sin embargo, el espacio de memoria accesible es tan grande que no significa que todo se utilice para memoria. En otras palabras, no solo la memoria es el objeto direccionable, sino que también se debe acceder a algunos periféricos a través del bus de direcciones. estos ¿Qué pasa con los periféricos?

Un método es el mapeo de memoria . La comprensión simple es mapear la memoria de video, el controlador del disco duro, etc. a la memoria. Leemos o escribimos en la posición correspondiente, lo que equivale a leer o escribir en la posición correspondiente de la memoria de video y otros periféricos Escribir, de modo que los periféricos y la memoria estén unificados.

Lo mismo ocurre con el BIOS, también se asignará a la memoria.

Genial, ahora se puede explicar con un simple conocimiento previo, seguimos presionando hacia abajo.

3. Distribución de la memoria en modo real

Acabo de decir que la memoria está dividida en áreas para varios periféricos, por lo que, naturalmente, surge la pregunta, ¿qué área está asignada a qué periférico? Si es una regla, debería ser mejor tener una mesa. Sí, es cierto. Es la distribución de la memoria en modo real. Le hice un dibujo:

Vaya, realmente soy un angelito. He mostrado las proporciones. Si puedes encontrar algo más intuitivo que el mío en Internet, por favor déjame un mensaje.

Explicaré después del modo real El simple entendimiento ahora es que solo 1M de memoria está disponible cuando la computadora está encendida.

Vemos que la memoria está dividida por varios periféricos, es decir, mapeada en la memoria.

El BIOS es más despiadado. No solo su espacio está asignado a la ubicación de memoria 0xC0000-0xFFFFF, sino que el programa dentro de él también ocupa algunas áreas al principio. Por ejemplo, la tabla de vectores de interrupción se escribe al principio de la memoria. es realmente el llamado por orden de llegada.

4. Cómo iniciar la ejecución desde el programa en BIOS

Bien, ahora sabemos que la información en el BIOS se asigna a la ubicación de memoria 0xC0000-0xFFFFF, y el BIOS del sistema más crítico se asigna a la ubicación 0xF0000-0xFFFFF.

Si digo ahora que el arranque de la CPU es para ejecutar el código en esta área, y luego Barabara arrancará después de una operación corta, debes rociarme, ¿por qué te detuviste aquí? ¿Por qué no empezar desde el principio?

Esto naturalmente tiene una conjetura, necesitamos usar otro conocimiento previo, que es donde la CPU obtiene la ejecución de la memoria y la ejecuta.

Es el valor de la dirección en el registro de la PC .

La dirección de entrada y la dirección de inicio del programa BIOS es 0xFFFF0 (eso es lo que la gente escribe), es decir, cuando se presiona el botón de encendido, debe haber un poder mágico para cambiar el valor en el registro de la PC a 0xFFFF0, y entonces la CPU empieza a no hacer nada. Sí, la siguiente oración puede ser la respuesta que ha estado buscando durante mucho tiempo, esté preparado:

En el momento en que arranca, el registro de PC de la CPU se ve obligado a inicializarse a 0xFFFF0 .

(Para ser más específico, la CPU inicializa el registro de dirección base del segmento cs a 0xF000 y el registro de dirección de desplazamiento IP a 0xFFF0. Según las reglas de cálculo de dirección final en modo real, la dirección base del segmento se desplaza 4 bits a la izquierda, más la dirección de desplazamiento, se obtiene la dirección física final, es decir, la dirección de registro de PC abstraída es 0xFFFF0.)

Cuando estaba aprendiendo este conocimiento, vi esta frase que me permitió resolver las dudas de larga data en mi corazón. Qué verdad tan simple y grosera. En este punto, también suspiré aliviado, porque el resto del proceso es casi como una cuenta corriente.

En cuanto a cómo forzar la inicialización, creo que ha traspasado los límites del preconocimiento. Además, las implementaciones de hardware de varios fabricantes no son necesariamente las mismas. Hay muchas formas y son muy sencillas. No tiene mucho sentido discutirlo.

5. ¿Qué programa está escrito en el BIOS?

Bueno, ahora sabemos que la CPU inicializa a la fuerza el registro de su PC en la dirección de entrada del programa BIOS en el momento del arranque, de ahí en adelante, la CPU avanzó sin detenerse.

Entonces, la siguiente pregunta parece formularse de manera muy natural, es decir, ¿qué está escrito en el programa BIOS?

No es apropiado publicar toda la información binaria en el programa BIOS, analizamos algunas de las principales. Primero adivinemos, verá que la dirección de entrada es 0xFFFF0, lo que indica que el programa se ejecuta desde aquí. El límite inferior de la memoria en modo real es 0xFFFFF, es decir , solo quedan 16 bytes para escribir código ¿Qué es suficiente?

Si está interesado, debería poder adivinar que la dirección de entrada puede ser una instrucción de salto para saltar a un espacio más grande y realizar su propia tarea. Así es. Las instrucciones de la máquina almacenadas en 0xFFFF0, traducidas al lenguaje ensamblador son:

jmp far f000:e05b

Significa saltar a la dirección física 0xfe05b e iniciar la ejecución (recuerde el método de cálculo de dirección en modo real mencionado anteriormente).

Comenzando en la dirección 0xfe05b es el código que realmente reproduce la BIOS, este código detectará alguna información periférica, inicializará el hardware, establecerá una tabla de vectores de interrupción y completará las rutinas de interrupción. No expanda la parte aquí. Este es solo un programa codificado de forma rígida, y no es útil comprender el proceso de inicio. Veamos la siguiente parte maravillosa, que es la última tarea del BIOS: cargar el área de inicio .

Seis, ¿qué es 0x7c00?

El lugar para ser más real es ser más real. Nunca dejaré que las palabras que cargan este tipo de magia aparezcan aquí. Vamos a desmontarlo ahora.

De hecho, el término no es mágico, la carga en el campo de la computadora se refiere al proceso de copiar un programa en un dispositivo (como un disco duro) en la memoria . El proceso de traducción para cargar el área de inicio es que el programa BIOS copia el contenido del área de inicio en un área determinada de la memoria .

De acuerdo, el problema vuelve a surgir naturalmente ¿Dónde está la zona de inicio? ¿Dónde se copia la memoria? ¿y luego? Responderemos uno a uno.

¿Qué es la zona de arranque? Aunque no la conozcas, deberías poder adivinar que debe ser un área que cumpla con una determinada característica, por lo que la gente la llama área de inicio ¿Qué características debe reunir? No se preocupe, no sé si tiene alguna experiencia en la configuración de la secuencia de arranque del BIOS. Por lo general, hay arranque desde disco U, arranque desde disco duro, arranque desde disquete, arranque desde CD, etc. El BIOS leerá estos discos de arranque en orden, que se encuentra en la pista 0 del disco 0. 1 El contenido del sector .

En cuanto a la división del formato del disco, este artículo no lo explicará. En resumen, para la memoria, podemos obtener los datos en esa dirección dando una dirección numérica. Para el disco, necesitamos dar la cabeza, el cilindro, y sector. Los datos que pueden ubicar una determinada ubicación con solo una pieza de información son solo una forma de describir la ubicación.

Entonces, el contenido de este sector 0 disco 0 pista 1 tiene un total de 512 bytes Si los dos últimos bytes son 0x55 y 0xaa respectivamente, entonces el BIOS lo considerará un área de arranque . Si no es así, proceda al siguiente dispositivo para encontrar el contenido ubicado en el sector 0 disco 0 pista 1. Si encuentra que ninguno de ellos cumple con las condiciones al final, informará directamente un error de área sin inicio.

¿Qué hace la BIOS después de encontrar esta área de arranque? Oh, dije antes que se está cargando, lo que significa que el contenido de estos 512 bytes, un bit, se copia en la ubicación de memoria 0x7c00 . ¿Cómo se copia? Por supuesto que son instrucciones. ¿Qué instrucciones? Aquí solo puedo decir simplemente que hay entradas y salidas en el conjunto de instrucciones, que se utilizan para copiar los datos en el periférico a la memoria, o copiar los datos en la memoria al periférico. Utilice estas dos instrucciones y el periférico para proporcionarnos Esto se puede hacer mediante la lectura.

Una vez completada la copia, nuestro programa debería hacerse cargo del resto del proceso, ¡y la misión del BIOS ha terminado!

Pero antes de que termine, debe saltar a la dirección 0x7c00 y la instrucción comienza a ejecutarse desde aquí.

¿Eh? No sé si te diste cuenta de que parece que hemos vuelto a traducir un lenguaje mágico anterior a palabras adultas sin saberlo. Al principio dijimos:

El BIOS transfiere el control al dispositivo de almacenamiento que ocupa el primer lugar.

Entonces, ¿qué significa esta oración? Es decir, el BIOS copia los 512 bytes del área de arranque en la ubicación 0x7c00 de la memoria y usa una instrucción de salto para apuntar el valor del registro de la PC a 0x7c00 . Verá, solo hay unas pocas palabras más, así que dejemos la pregunta clara y simple.

Oh, por cierto, parece que queda una pregunta ahora, ¿por qué tiene que ser 0x7c00? Buena pregunta. Por supuesto, la respuesta es muy simple. Así es como lo hizo el equipo de desarrollo de BIOS, y no será fácil de cambiar después, de lo contrario no es compatible. ¿Por qué no es fácil de cambiar? Veamos un código simple de 512 bytes en el área de arranque. (El código está extraído de "30 días de sistema operativo de fabricación propia")

; hello-os
; TAB=4

  ORG  0x7c00   ;程序加载到内存的 0x7c00 这个位置

;程序主体

entry:
  MOV  AX,0   ;初始化寄存器
  MOV  SS,AX
  MOV  SP,0x7c00
  MOV  DS,AX   ;段寄存器初始化为 0
  MOV  ES,AX
  MOV  SI,msg
putloop:
  MOV  AL,[SI]
  ADD  SI,1
  CMP  AL,0   ;如果遇到 0 结尾的,就跳出循环不再打印新字符
  JE  fin
  MOV  AH,0x0e   ;指定文字
  MOV  BX,15   ;指定颜色
  INT  0x10   ;调用 BIOS 显示字符函数
  JMP  putloop
fin:
  HLT
  JMP  fin
msg:
  DB  0x0a,0x0a  ;换行、换行
  DB  "hello-os"
  DB  0x0a   ;换行
  DB  0    ;0 结尾

  RESB 0x7dfe-$   ;填充0到512字节
  DB 0x55, 0xaa   ;可启动设备标识

Miramos la primera línea:

ORG  0x7c00

Este número es la ubicación de carga del área de arranque que se acaba de mencionar. Esta línea de código de ensamblaje simplemente significa agregar 0x7c00 a todas las direcciones siguientes. Solo porque el BIOS carga el código de área de inicio aquí, hay un desplazamiento, por lo que todos los que escriben el código de área de inicio deben escribir dicho código al principio; de lo contrario, todo se serializará.

Y solo porque todos aquellos que escriben el sistema operativo, la primera línea de código de ensamblaje en el área de arranque está muerta con este número, entonces el número originalmente establecido por el desarrollador del BIOS no es fácil de cambiar, de lo contrario, debe contactar a los desarrolladores de cada sistema operativo uno por uno. Diga oh, cambiaré esta dirección, y usted la cambiará en consecuencia. Presionar a otro equipo para que cambie un código en la empresa tiene que ser un gran problema, piense en cuánta mano de obra requiere tal impulso. Además, incluso si se cambia, el código anterior ya no es compatible, esto no debe ser regañado por la gente.

Mire la última línea nuevamente:

DB 0x55, 0xaa

Esto también verifica que los dos últimos bytes de los 512 bytes que dijimos antes deben ser 0x55 0xaa, la BIOS lo considerará como un área de arranque, y lo cargará, y nada más.

Mirando hacia atrás en el valor de 0x7c00, en realidad es un valor regulado, pero algunas personas aún preguntarán, debe tener su racionalidad. De hecho, mi explicación solo puede decir que la gente establece este valor y luego la gente explica esta racionalidad por ellos. No significa que la gente deba haber pensado así al principio, al igual que nosotros estamos haciendo problemas de comprensión lectora en chino.

El primer equipo de desarrollo de BIOS fue el BIOS IBM PC 5150. El primer sistema operativo considerado en ese momento fue el sistema operativo DOS 1.0, y el equipo de BIOS asumió que le servía.

Pero el sistema operativo aún no ha salido, y el equipo de BIOS asume que la memoria mínima requerida para su sistema operativo es de 32 KB. El BIOS espera que el código de área de arranque cargado por sí mismo esté lo más atrás posible, para que sea "seguro" y no sea sobrescrito por otros programas antes de tiempo. Pero si solo quedan 512 bytes, se siente demasiado sobresaliente y todavía hay algo de espacio en la pila que debe reservarse, así que amplíelo a 1 KB. Entonces, el final de 32 KB es 0x8000, menos 1KB (0x400), que es exactamente igual a 0x7c00. Vaya, demasiado preciso, esta puede ser una forma de explicación.

Siete, lo que está escrito en el código en el área de inicio.

De hecho, en este punto, mi artículo debería detenerse abruptamente, porque el problema original se ha resuelto y la CPU ha comenzado a funcionar sin parar desde nuestra posición esperada. Todo es difícil al principio, y el resto es la operación. El sistema puede jugar todo lo que quiera.

Pero no creo que sepa lo suficiente y parece que hay algunas preguntas en tu mente. Por ejemplo, esta pregunta:

¿Qué está escrito en el código en el área de lanzamiento? ¿Son 512 bytes el contenido completo del sistema operativo?

Esta es una buena pregunta. 512 bytes realmente no pueden hacer nada. Ahora el sistema operativo tiene que contarse en unidades M. 512 bytes están lejos de ser suficiente. ¿Cuál es el problema?

De hecho, podemos suponer a partir del pensamiento anterior que el BIOS carga el contenido del área de arranque de 512 bytes en la memoria con muy poco código y salta para iniciar la ejecución. De acuerdo con esta rutina, ¿el código de área de arranque de 512 bytes puede cargar más programas del sistema operativo almacenados en el disco en una ubicación determinada de la memoria y luego saltar a ella?

Así es, esta es la rutina. Entonces, el BIOS es responsable de cargar el área de arranque y el área de arranque es responsable de cargar el kernel del sistema operativo real ¿Funciona esto en armonía?

Dado que el disco utilizado para el disco de arranque lo hace el fabricante que escribe el sistema operativo, comúnmente conocido como disco de arranque, también debe saber en qué sector del disco está almacenado el código central del sistema operativo, por lo que este sector es almacenados en el área de arranque, y después de eso, muchos y muchos sectores (dependiendo del tamaño del sistema operativo) se leen en la memoria, y luego saltan al principio del principio del programa. ¿A dónde saltas? Este no es tan clásico como el número 0x7c00. Los diferentes sistemas operativos son definitivamente diferentes, y no hay necesidad de predeterminarlo. De todos modos, la persona que escribe el sistema operativo puede configurar uno para sí mismo. No cubra el área utilizada por otros dispositivos clave.

8. ¿Qué escribió el kernel del sistema operativo?

Bien, ahora después de varias rondas de saltos y saltos, finalmente saltando al código del kernel, revisémoslo juntos:

  1. Presione el botón de encendido y la CPU inicializará a la fuerza el valor del registro de la PC a 0xffff0, que es la dirección de entrada del programa BIOS (un salto)

  2. La dirección de entrada es una instrucción de salto, salta a la posición 0xfe05b e inicia la ejecución (dos saltos)

  3. Después de realizar algunas pruebas de hardware, el último paso es cargar el contenido del área de arranque en la memoria 0x7c00 y saltar a ella (tres saltos)

  4. El código de área de arranque es principalmente para cargar el kernel del sistema operativo y saltar al punto de carga (cuatro saltos)

Después de estos cuatro saltos consecutivos, finalmente llegué al mundo de los sistemas operativos. El resto del contenido se puede decir que son los principios descritos en todo el curso de sistema operativo, como segmentación, paginación, establecimiento de interrupciones, controladores de dispositivos, memoria gestión y gestión de procesos., Sistema de archivos, interfaz de modo de usuario, etc.

Es posible que haya escuchado más o menos de estos términos en los cursos de sistema operativo. Si los aprende bien, debe conocer los principios generales. Pero para un perro incondicional como el autor que ha estudiado el código fuente del kernel de Linux de principio a fin, estos Los conceptos no son solo conceptos aburridos en los libros, sino flexibles y flexibles En cada línea de código en el sistema operativo, algunos muestran la incomparable sabiduría del autor, y otros me dejan ver la rendición del autor debido a la configuración del hardware.

Si este artículo te trae curiosidad sobre el sistema operativo, te sugiero que encuentres tiempo para leerlo, únete a mí en el hoyo, encontrarás que se te abre la puerta a un nuevo mundo.

Nueve, materiales de referencia

Bueno, esta vez realmente quiero terminar. Creo que si realmente lees el texto completo, se puede decir que el proceso de inicio de la computadora tiene una comprensión más concreta. Si quieres entrar en detalles, es decir, entender cada punto de todo el proceso, entonces tienes que trabajar duro.

Los principiantes recomiendan dos libros, que se pueden leer en orden. Les deseo un pozo:

  • "30 días de sistema operativo de fabricación propia"

  • "Restauración de la verdad del sistema operativo"

Finalizar

Programación de baja concurrencia, muy decadente el lunes, hardcore el jueves

Supongo que te gusta

Origin blog.csdn.net/coderising/article/details/113488638
Recomendado
Clasificación