-
El mapeo del kernel existe principalmente para los propósitos del kernel, no para los procesos del usuario. Desde la perspectiva de la CPU, cualquier dirección de memoria física que no esté asignada como una dirección lineal podría no existir. Pero la CPU necesita poder llamar al kernel:para atender interrupciones, manejar excepciones... También necesita poder llamar al kernel cuando un proceso de usuario emite una llamada al sistema (hay varias formas en que esto puede suceder, así que no entraré en detalles). En la mayoría de las arquitecturas, si no en todas, esto sucede sin la oportunidad de cambiar las tablas de página; consulte, por ejemplo,
SYSENTER
. Por lo tanto, como mínimo, los puntos de entrada al núcleo deben asignarse al espacio de direcciones actual en todo momento. -
Kernel asignaciones son dinámicos, pero el espacio de direcciones no lo es. En x86 de 32 bits, hay varias divisiones disponibles, como la división de 3/1 GiB que se muestra en su diagrama; en x86 de 64 bits, la mitad superior del espacio de direcciones está reservada para el núcleo (consulte el mapa de memoria en la documentación del núcleo). Esa división no se puede mover. (Tenga en cuenta que las bibliotecas se cargan en el espacio del usuario. Los módulos del kernel se cargan en el espacio del kernel, pero nuevamente eso solo cambia las asignaciones, no la división del espacio de direcciones).
-
En el modo de usuario, hay una asignación única para el kernel, compartida entre todos los procesos. Cuando cambia la asignación de una página del lado del núcleo, ese cambio se refleja en todas partes.
Cuando KPTI está habilitado, el kernel tiene sus propias asignaciones privadas, que no se exponen cuando se ejecuta el código de espacio de usuario; por lo tanto, con KPTI hay dos asignaciones, y los cambios en el kernel privado no serán visibles para el espacio del usuario (que es el punto central de KPTI).
El mapa de memoria del kernel siempre asigna todo el kernel (en modo kernel cuando se ejecuta KPTI), pero no es necesariamente uno a uno:en x86 de 64 bits, por ejemplo, incluye un mapa completo de memoria física, por lo que todas las direcciones físicas del kernel son mapeado al menos dos veces.
Cómo usar el comando sed de Linux