GNU/Linux >> Linux Esercitazione >  >> Linux

A che serve avere una parte del kernel nello spazio di memoria virtuale dei processi Linux?

  1. 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.

  2. 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.)

  3. 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.


Linux
  1. Che cos'è il kernel Linux e dovresti aggiornare al kernel più recente?

  2. Linux:cosa sono la memoria alta e la memoria insufficiente su Linux?

  3. Linux:cosa implica il layout della memoria del kernel virtuale in Dmesg?

  4. Linux:quali sorgenti di entropia vengono utilizzate dal kernel Linux?

  5. Driver del dispositivo del kernel Linux a DMA da un dispositivo nella memoria dello spazio utente

Come usare il comando sed di Linux

Il kernel Linux:le 5 migliori innovazioni

Qual ​​è la differenza tra i kernel macOS e Linux

Che cos'è la shell in Linux?

Qual è il vantaggio di compilare il proprio kernel Linux?

Quanta RAM utilizza il kernel?