2012-04-04 7 views
7

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.

+0

Pensa a 'page' come elemento nell'array' mem_map'. –

risposta

1

è necessario mappare un page nella memoria del kernel come segue: (. Vedi this collegamento per ex)

void * mapping = kmap_atomic(page, KM_USER0); 
// work with mapping... 
kunmap_atomic(mapping, KM_USER0); 

Questo trucco è necessaria in quanto v'è un concetto HighMemory in Linux.

UPD: È possibile utilizzare kmap invece di kmap_atomic in contesti non-atomiche.

+1

L'OP dice che ha già una 'struct page', perché dovrebbe doversi mappare esattamente? (BTW: http://lwn.net/Articles/356378/; il secondo argomento su kmap_atomic è andato via qualche volta nel 2009 afaict) – Mat

+0

Bene, ci sono alcuni vincoli quando si ha a che fare con HighMemory. Il kernel generico a 32 bit può vedere solo 1G di memoria (dopo 0xc000000). Quindi immagina di avere più di 4G di RAM. Come si accede dal kernel? –

Problemi correlati