In che modo il kernel impedisce a un programma dannoso di leggere tutta la RAM fisica?


10

Se scrivo un programma che tenta di leggere la memoria ad ogni possibile indirizzo e lo eseguo su un Unix "completo", non sarà in grado di accedere a tutta la RAM fisica. Ma come fa il sistema operativo a impedirlo?

Conosco meglio le architetture di CPU di piccole dimensioni in cui qualsiasi codice assembly può accedere a tutto. Non capisco come un programma (il kernel) possa rilevare tali operazioni dannose.


2
Di solito la MMU si preoccupa di non poter accedere alla memoria al di fuori delle aree consentite.
ott--

1
Bene, la MMU è configurata dall'assembly. Quindi un codice assembly può modificare la configurazione MMU e accedere a una pagina di memoria diversa, giusto?
nowox,

Questo è vero solo se si esegue il codice come root.
ott--

2
Dovresti leggere le tabelle delle pagine e l'astrazione del kernel lì dentro.
Clarus,

@ott: anche root non può modificare la MMU (almeno non su Linux). Lo fa solo il kernel.
Basile Starynkevitch il

Risposte:


12

Non è il kernel che impedisce accessi errati alla memoria, è la CPU. Il ruolo del kernel è solo quello di configurare correttamente la CPU.

Più precisamente, il componente hardware che impedisce accessi errati alla memoria è la MMU . Quando un programma accede a un indirizzo di memoria, l'indirizzo viene decodificato dalla CPU in base al contenuto della MMU. La MMU stabilisce una traduzione da indirizzi virtuali a indirizzi fisici: quando la CPU esegue un caricamento o un archivio in un determinato indirizzo virtuale, calcola l'indirizzo fisico corrispondente in base al contenuto della MMU. Il kernel imposta la configurazione MMU in modo tale che ogni programma possa accedere solo alla memoria a cui ha diritto. I registri di memoria e hardware di altri programmi non sono affatto mappati nella memoria di un programma: questi indirizzi fisici non hanno un indirizzo virtuale corrispondente nella configurazione MMU per quel programma.

In un cambio di contesto tra processi diversi, il kernel modifica la configurazione MMU in modo che contenga la traduzione desiderata per il nuovo processo.

Alcuni indirizzi virtuali non sono affatto mappati, ovvero la MMU li traduce in uno speciale valore "nessun indirizzo simile". Quando il processore dereferenzia un indirizzo non mappato, ciò provoca una trappola: il processore si dirama verso una posizione predefinita nel codice del kernel. Alcune trappole sono legittime; ad esempio l'indirizzo virtuale potrebbe corrispondere a una pagina che si trova nello spazio di swap , nel qual caso il codice del kernel caricherà il contenuto della pagina da swap, quindi tornerà al programma originale in modo tale che l'istruzione di accesso alla memoria venga nuovamente eseguita. Altre trap non sono legittime, nel qual caso il processo riceve un segnale che di default uccide immediatamente il programma (e se non si dirama al gestore del segnale nel programma: in ogni caso l'istruzione di accesso alla memoria non è completata).


Potresti specificare un po 'la frase "l'indirizzo è decodificato dalla CPU in base al contenuto della MMU" ? Esiste un codice effettivo nel programma in esecuzione che decodifica gli indirizzi? O quando una CPU accede a un indirizzo - l'accesso è fatto a MMU, che lo traduce / lo gestisce correttamente (accede alla memoria o alla cache e restituisce il risultato o attiva una procedura del kernel)? Quindi, dal punto di vista del microcontrollore / assemblaggio, la MMU è una parte nuova. La CPU non è collegata direttamente alla memoria, è connessa a MMU ed è qui che viene eseguita l'astrazione della memoria virtuale.
Xealits,

3
@xealits La traduzione da indirizzo virtuale a indirizzo fisico avviene all'interno della MMU, che è un circuito hardware. Non esiste un codice per farlo nel programma o nel kernel. Il kernel viene invocato solo in casi eccezionali, quando il programma tenta di accedere a un indirizzo virtuale per il quale la voce MMU dice "indirizzo non valido". Il kernel svolge anche il compito di configurare i registri e le tabelle nella RAM utilizzati dalla MMU.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.