
Tengo dos preguntas sobre el diseño de direcciones virtuales del kernel en sistemas x86 y x64.
Hasta donde yo sé, x86 usa el diseño de memoria dividida que es highmem y lowmem.
Si mi comprensión es correcta, la única diferencia entre highmem y lowmem es si tiene asignación de direcciones virtuales a físicas 1:1 o no.
Además, parece que lowmem contiene código y datos a los que el programa del kernel accede con frecuencia y highmem contiene tablas de páginas o datos del programa a nivel de usuario a los que no se accede con frecuencia.
Sin embargo, no puedo entender la razón por la que el kernel x86 divide los espacios de direcciones virtuales y ubica los datos y el código a los que se accede con frecuencia en lowmem. ¿Cuál es la ventaja de ello? Parece que, independientemente de la ubicación de la memoria del núcleo, se debe invocar el recorrido de la tabla de páginas para obtener asignaciones virtuales a físicas. Si es correcto, parece que no hay ventaja entre highmem y lowmem.
Aquí, mi primera pregunta es, si lowmem usa las asignaciones 1:1 (es decir, dirección física + constante (0x80000000) => dirección virtual del kernel), ¿por qué la MMU gasta su reloj recorriendo la tabla de páginas para conocer las asignaciones virtuales a físicas? Si es posible, podemos modificar la lógica de la MMU para que solo reste la constante mágica de la dirección virtual para obtener una dirección física si está ubicada en la región de baja memoria. ¿O hay otras razones para ubicar los datos y el código a los que se accede con frecuencia en lowmem? ¿Y por qué sólo lowmem usa las asignaciones 1:1...?
Mi segunda pregunta es "¿el mecanismo de división de memoria de baja y alta memoria también se implementa en el sistema Linux x64?"
gracias de antemano
Respuesta1
altomemybaja memoriaestán relacionados con la extensión de dirección física en procesadores x86. Este mecanismo permite al procesador ocupar 64 GB de memoria, en lugar de los 4 GB convencionales. Sin embargo, debido a que el conjunto de instrucciones no ha cambiado y los registros y punteros todavía tienen una longitud de 32 bits, el espacio de direcciones virtuales todavía está limitado a 4 GB. Las instrucciones de la máquina siempre utilizan direcciones virtuales, no direcciones físicas.
La consecuencia de esto es que "highmem" no se puede abordar directamente hasta que se asigne a la región direccionable. Esta es la razón por la que sólo lowmem utiliza el mapeo 1:1; No es posible mapear a highmem.
Su siguiente pregunta fue: ¿por qué no se puede simplificar la lógica de MMU para omitir tablas de páginas y hacer una resta simple para obtener la dirección física? La MMU está implementada en hardware y está diseñada para utilizar tablas de páginas (y el TLB) para realizar su trabajo. Sin embargo, existen páginas "enormes" que saltan un nivel en las tablas de páginas, lo que hace que el tamaño de la página sea de 4 MB en lugar de 4 kB en el x86.
Su última pregunta: ¿la memoria también está dividida en memoria baja y alta en la arquitectura x64? No. El mecanismo PAE es un poco complicado para extender la vida útil del x86. El x64 con sus espacios de direcciones mucho más grandes (tanto físicos como virtuales) no lo necesita.