Diciamo che abbiamo uno struct page
dallo spazio indirizzo di un file della cache della pagina.Come ottenere l'indirizzo fisico dei dati associati da una pagina della struttura?
Come è possibile ottenere l'indirizzo fisico iniziale dei dati 4KB da questo struct page
?
Suppongo che ci dovrebbe essere qualcosa come il puntatore data
all'interno di struct sk_buff
, ma non l'ho trovato.
EDIT
Grazie Mat e llya per le risposte.
Dopo aver esaminato le risposte, penso che il primo problema è identificare se il struct page
si trova in ZONE_NORMAL
o ZONE_HIGHMEM
.
Durante un I/O di file, quando non viene trovata la pagina memorizzata nella cache, inizialmente allocare una nuova pagina utilizzando page_cache_alloc_cold()
. page_cache_alloc_cold()
chiamerà infine alloc_pages()
che sembra utilizzerà lo ZONE_HIGHMEM
(che in x86 è l'area di memoria del kernel a partire da PAGE_OFFSET
+ 896M) per il suo lavoro.
Così
- penso la risposta di Mat è adatto per le pagine in
ZONE_NORMAL
- Supponiamo che usiamo
kmap()
per trovare l'indirizzo fisico iniziale dei dati 4KB associato alla pagina struct, è corretto che dovremmo utilizzare(unsigned long)(&page)-PAGE_OFFSET
per trovare l'indirizzo fisico in cui memorizza la struttura stessa?
Si prega di correggere.
Pensa a 'page' come elemento nell'array' mem_map'. –