Estructura de PTE en el kernel de Linux
-
10-07-2019 - |
Pregunta
He estado intentando buscar en el código fuente de Linux una estructura / unión que correspondería al PTE en el sistema x86 con PAE deshabilitado. Hasta ahora solo he encontrado lo siguiente en arch / x86 / include / asm / page_32.h
typedef union {
pteval_t pte;
pteval_t pte_low;
} pte_t;
Estoy un poco confundido en este momento ya que tengo el Manual de referencia de Intel Vol. 3A abierto frente a mí y nada en esa unión corresponde a la docena de campos impares presentes en el PTE como explica el manual.
Esta podría ser una pregunta trivial, pero para mí se ha convertido más en un obstáculo en el proceso de comprender la administración de memoria en el kernel de Linux.
EDITAR: tengo la fuente 2.6.29 conmigo
Solución
pteval_t solo trata la entrada de la tabla de páginas como un blob opaco; en la arquitectura que está viendo, es solo un valor sin signo de 32 bits.
Se accede a los campos dentro del PTE utilizando operadores y máscaras bit a bit; en la fuente que tengo a mano (Linux 2.6.24), estos se definen en include / asm-x86 / pgtable_32.h
. Los campos que ve en el Manual de referencia de Intel (la mayoría de los cuales son indicadores de un solo bit) se definen aquí, por ejemplo:
#define _PAGE_PRESENT 0x001
#define _PAGE_RW 0x002
#define _PAGE_USER 0x004
#define _PAGE_PWT 0x008
#define _PAGE_PCD 0x010
#define _PAGE_ACCESSED 0x020
#define _PAGE_DIRTY 0x040
#define _PAGE_PSE 0x080 /* 4 MB (or 2MB) page, Pentium+, if present.. */
#define _PAGE_GLOBAL 0x100 /* Global TLB entry PPro+ */
#define _PAGE_UNUSED1 0x200 /* available for programmer */
#define _PAGE_UNUSED2 0x400
#define _PAGE_UNUSED3 0x800
Otros consejos
Recomiendo comprar Comprensión del kernel de Linux de O'REILLY, así como Controladores de dispositivos Linux . Y suscribiéndose a LWN.net ; aunque puede obtener un buen comienzo desde su página del índice del kernel incluso sin una suscripción.
Para la gestión de memoria, busque en la página de índice la " Gestión de memoria " sección ... y los "Sistemas de memoria grande" sección. Este último tiene algunos artículos que hablan sobre el cambio a tablas de páginas de cuatro niveles que deberían ser útiles para comprender esta área del código.