Domanda

Stavo pensando a come il kernel di Linux implementa le chiamate di sistema e mi chiedevo se qualcuno mi potrebbe dare una visione di alto livello di come sbrk / lavoro BRK?

Ho rivisto il codice del kernel, ma c'è solo così tanto di esso e io non lo capisco. Speravo in una sintesi da parte di qualcuno?

È stato utile?

Soluzione

In vista di altissimo livello, il kernel di Linux tracce della memoria visibile ad un processo come diverse "aree di memoria" (struct vm_area_struct). V'è anche una struttura che rappresenta (sempre in una vista molto elevato) un processo intero spazio di indirizzi (struct mm_struct). Ogni processo (tranne alcuni fili kernel) ha esattamente un struct mm_struct, che a sua volta punta a tutto il struct vm_area_struct per la memoria può accesss.

La chiamata di sistema sys_brk (trovato in mm/mmap.c) regola semplicemente alcune di queste aree di memoria. (sbrk è un wrapper glibc intorno brk). Lo fa mettendo a confronto il vecchio valore dell'indirizzo brk (che si trova all'interno struct mm_struct) e il valore richiesto.

Sarebbe più semplice per guardare alla famiglia mmap di funzioni prima, dal momento che brk è un caso speciale di esso.

Altri suggerimenti

si deve capire come funziona la memoria virtuale, e come una mappatura MMU si riferisce alla vera RAM.

RAM reale è suddiviso in pagine, tradizionalmente 4kB ciascuno. ogni processo ha la propria mappatura MMU, che presenta a tale processo uno spazio di memoria lineare (4GB Linux a 32 bit). Naturalmente, non tutti è effettivamente assegnati. in un primo momento, è quasi vuoto, che non è la pagina vera e propria è associato con maggior parte degli indirizzi.

quando il processo colpisce un indirizzo non assegnato (o cercando di leggere, scrivere o eseguirlo), la MMU genera un errore (simile ad un interrupt), e il sistema della VM viene richiamato. In caso di decisione un po 'di RAM dovrebbe essere lì, raccoglie una pagina di RAM inutilizzata e l'associa con quella intervallo di indirizzi.

In questo modo, il kernel non interessa come il processo utilizza la memoria, e il processo in realtà non importa la quantità di RAM v'è, sarà sempre la stessa 4GB lineare di spazio di indirizzi.

Ora, il lavoro brk/sbrk a un livello leggermente più alto: in linea di principio qualsiasi indirizzo di memoria 'al di là' tale marchio non è valido e non sarà possibile ottenere una pagina di RAM se si accede, il processo sarebbe stato ucciso, invece. la biblioteca spazio utente gestisce le allocazioni di memoria all'interno di questo limite, e solo quando necessario chiedere al kernel di aumentarlo.

Ma anche se un processo avviato impostando brk al massimo consentito, non consente di ricevere pagine reale RAM allocata fino a quando non inizia l'accesso a tutti che gli indirizzi di memoria.

Bene, dal punto di vista super-alto livello, il kernel alloca un blocco paginabile della memoria, modifica le tabelle delle pagine del processo che richiede che il blocco in modo che la memoria è mappato nello spazio VA del processo, quindi restituisce l'indirizzo.

Un concetto chiave di come il kernel di linux passa di memoria a un processo utente è che i processi disponibili heap (il segmento di dati) cresce dal basso. il kernel non tiene traccia di singoli blocchi di memoria, solo un blocco di memoria. le chiamate di sistema brk / sbrk espandere la quantità di memoria il processo ha, ma è fino al processo per gestire in pezzi utilizzabili.

Una conseguenza fondamentale di questo è che la memoria sparsi per i processi affrontare spazio che non è in uso non può essere restituito al sistema operativo per altri usi. Solo memoria alla fine del segmento di dati può essere restituito al sistema operativo, così memoria in uso verso la fine dovrebbe essere spostato verso il basso verso l'alto. In pratica quasi nessun ripartitori farlo. Per questo motivo, di solito è importante fare un buon lavoro di gestione della quantità massima di memoria utilizza un processo, a causa che determina la quantità di memoria sarà lasciato per altri processi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top