GNU/Linux >> Linux Esercitazione >  >> Linux

Perché il kernel è mappato allo stesso spazio di indirizzi dei processi?

Per rispondere a un'altra parte della domanda:il kernel è mappato in ogni spazio di indirizzamento dei processi parzialmente per motivi di efficienza/prestazioni (ce ne sono anche altri, ne sono sicuro).

Sulla maggior parte dell'hardware moderno, è più rapido modificare il livello di sicurezza (consentendo così l'accesso alle pagine altrimenti protette, come menzionato nella risposta di Alexey) per eseguire chiamate di sistema e altre funzioni fornite dal kernel piuttosto che modificare il livello di sicurezza e l'intera mappa della memoria virtuale, insieme a tutti gli svuotamenti della cache TLB associati e tutto il resto coinvolto in un cambio di contesto completo.

Poiché le chiamate di sistema possono essere eventi abbastanza frequenti, il design che si è evoluto in Linux e in molti altri luoghi per cercare di ridurre al minimo l'overhead dell'utilizzo dei servizi del kernel e mappare il codice del kernel e (almeno alcuni dei) dati in ciascun processo fa parte di quello.


Un processo "possiede" l'intero spazio degli indirizzi virtuali qui, il kernel e le sue parti utente.

La sua incapacità di sbirciare e colpire il codice e i dati del kernel non è dovuta a diversi spazi di indirizzi, ma a diversi diritti di accesso/permessi impostati nelle tabelle delle pagine. Le pagine del kernel sono configurate in modo tale che le normali applicazioni non possano accedervi.

Tuttavia, è consuetudine riferirsi alle due parti di un'unica cosa come lo spazio del kernel e lo spazio dell'utente e ciò può creare confusione.


Immagina cosa accadrebbe se il kernel non fosse mappato in ogni spazio di indirizzamento del processo. Sarebbe triplice errore perché diciamo che si verifica l'interrupt del timer, quindi il processore chiama la routine ISR usando IDT (Interrupt Descriptor Table). Se il kernel non è mappato, allora l'indirizzo IDT diventa non valido e quindi risulterà un triplo errore.


Un altro motivo importante per cui diciamo che il kernel si trova nello spazio degli indirizzi del processo è che il kernel può accedere al codice/dati utente del processo ATTUALE, ovvero lo spazio degli indirizzi virtuali 0~3G.

Mi dispiace per il mio povero inglese. Non sono un madrelingua inglese.


Linux
  1. Se i processi ereditano l'ambiente del genitore, perché abbiamo bisogno dell'esportazione?

  2. Perché più istanze di Mate-terminal hanno lo stesso Pid?

  3. Perché il kernel dovrebbe eliminare i pacchetti?

  4. Linux:perché esiste una politica del kernel Linux per non rompere mai lo spazio utente?

  5. Perché Apt non aggiorna più il kernel?

Comprensione del supporto degli indirizzi virtuali a 52 bit nel kernel Arm64

Linux:perché il kernel non può eseguire Init?

Spazio degli indirizzi del processo a 32 bit su Linux a 64 bit

I processi dormienti ottengono lo stesso tempo di CPU?

Perché il server Linux NFS è implementato nel kernel anziché nello spazio utente?

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