-
La mappatura del kernel esiste principalmente per gli scopi del kernel, non per i processi dell'utente. Dal punto di vista della CPU, qualsiasi indirizzo di memoria fisica che non sia mappato come indirizzo lineare potrebbe anche non esistere. Ma la CPU deve essere in grado di chiamare il kernel:per servire gli interrupt, per gestire le eccezioni... Deve anche essere in grado di chiamare il kernel quando un processo utente emette una chiamata di sistema (ci sono vari modi in cui questo può accadere quindi non entrerò nei dettagli). Nella maggior parte, se non in tutte, le architetture, ciò accade senza la possibilità di cambiare tabella delle pagine — vedi ad esempio
SYSENTER
. Quindi, come minimo, i punti di ingresso nel kernel devono essere sempre mappati nello spazio degli indirizzi corrente. -
allocazioni del kernel sono dinamici, ma lo spazio degli indirizzi non lo è. Su x86 a 32 bit sono disponibili varie divisioni, come la divisione 3/1 GiB mostrata nel diagramma; su x86 a 64 bit, la metà superiore dello spazio degli indirizzi è riservata al kernel (vedere la mappa della memoria nella documentazione del kernel). Quella divisione non può muoversi. (Notare che le librerie vengono caricate nello spazio utente. I moduli del kernel vengono caricati nello spazio del kernel, ma ancora una volta ciò cambia solo le allocazioni, non la suddivisione dello spazio degli indirizzi.)
-
In modalità utente, esiste un'unica mappatura per il kernel, condivisa tra tutti i processi. Quando la mappatura di una pagina lato kernel cambia, tale modifica si riflette ovunque.
Quando KPTI è abilitato, il kernel ha le proprie mappature private, che non vengono esposte durante l'esecuzione del codice dello spazio utente; quindi con KPTI ci sono due mappature e le modifiche a quella privata del kernel non saranno visibili nello spazio utente (che è il punto centrale di KPTI).
La mappa della memoria del kernel mappa sempre tutto il kernel (in modalità kernel durante l'esecuzione di KPTI), ma non è necessariamente uno a uno:su x86 a 64 bit, ad esempio, include una mappa completa della memoria fisica, quindi tutti gli indirizzi fisici del kernel sono mappato almeno due volte.
Come usare il comando sed di Linux