2013-12-09 13 views
10

Come individuare i mapping di memoria per lo spazio del kernel? VA -> PAIn che modo la memoria virtuale del kernel è mappata alla memoria fisica

Sono a conoscenza del proc file system /proc/pid/maps & /proc/pid/mappings che ci dà le mappature delle applicazioni dello spazio utente. Qualcosa di simile a trovare le mappature dello spazio del kernel?

Grazie!

+0

Leggermente datato, ma ancora rilevante: http://www.tldp.org/LDP/tlk/mm/memory.html. –

+0

Qual è il tuo problema attuale? –

+0

http://books.msspace.net/mirrorbooks/linuxsystems/images/059600222X/figs/bels_0206.gif – MDMoore313

risposta

11

Ecco una risposta parziale, forse sarà d'aiuto.

Linux divide lo spazio di indirizzo virtuale del kernel in due parti: lowmem e vmalloc.

Lowmem utilizza una mappatura 1-1 tra indirizzi virtuali e fisici. Cioè l'indirizzo virtuale X è mappato all'indirizzo fisico X-C (dove C è costante, ad esempio 3 GB). Questa mappatura viene creata durante l'avvio e non viene mai modificata.

Vmalloc utilizza una mappatura dinamica, su richiesta. Su ogni allocazione, vengono trovate un mucchio di pagine fisiche e un intervallo di indirizzi virtuali e le tabelle di paging vengono modificate per creare la mappatura.

Due due sono separati da indirizzi virtuali. Diversi intervalli di indirizzi virtuali vengono utilizzati da ciascuno. L'intervallo lowmem viene sempre mappato, l'intervallo vmalloc viene mappato quando allocato.

+0

Grazie per la spiegazione. Come posso trovare la gamma di Lowmem? Riuscirò a trovare la costante di cui stai parlando, definita come PAGE_OFFSET che è 0xC0000000 – kimi

2

In realtà, kernelspace è suddiviso in memoria LOW e HIGH (l'area di vmalloc è una parte della memoria alta). Come ha detto ugoren, lowmem è una mappatura diretta, costruita al momento del boot. È possibile utilizzare memoria elevata, ad esempio, per mappare alcune pagine dello spazio utente utilizzando kmap (area pkmap). Ecco un'immagine più dettagliata, che puoi trovare nei log del kernel al momento dell'avvio. Esempio:

fixmap : 0xffc57000 - 0xfffff000 (3744 kB) 
pkmap : 0xff800000 - 0xffa00000 (2048 kB) 
vmalloc : 0xf7ffe000 - 0xff7fe000 (120 MB) 
lowmem : 0xc0000000 - 0xf77fe000 (887 MB) 
.init : 0xc0906000 - 0xc0973000 (436 kB) 
.data : 0xc071ae6a - 0xc08feb78 (1935 kB) 
.text : 0xc0400000 - 0xc071ae6a (3179 kB) 

In questo esempio 1Gb spazio kernel suddivise in 887 partire mem contro 120 highmem. Come puoi vedere 120 MB di memoria alta occupati dall'area di vmalloc, e solo 2 e 3 Kbs riservati per le aree pkmap e fixmap. Informazioni su fixmap che puoi leggere qui http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html.

Problemi correlati