2012-04-04 46 views
7

比方說,我們從頁面緩存文件的地址空間獲得了struct page如何從結構頁面獲取關聯數據的物理地址?

我們如何從這個struct page獲得4KB數據的起始物理地址?

我想應該是data指針裏面struct sk_buff,但我沒有找到它。


編輯

感謝墊子和llya的答案。

看完答案後,我認爲第一個問題是確定struct page是否位於ZONE_NORMALZONE_HIGHMEM

在文件I/O期間,當我們沒有找到緩存頁面時,我們將首先使用page_cache_alloc_cold()分配一個新頁面。 page_cache_alloc_cold()將最終調用alloc_pages(),看起來它將使用ZONE_HIGHMEM(它在x86中是內核內存區域,起始於PAGE_OFFSET + 896M)用於其作業。

所以

  • 我想墊的答案是適合頁ZONE_NORMAL
  • 假設我們使用kmap()找到與結構頁面相關聯的4KB數據的起始物理地址,是正確的,我們應該使用(unsigned long)(&page)-PAGE_OFFSET來查找存儲結構本身的物理地址?

請更正。

+0

將'page'想象成mem_map'數組中的一個項目。 – 2012-04-04 18:23:07

回答

1

你需要一個page映射到內核內存如下:(見this鏈接EX)是有HighMemory概念的Linux

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

這個技巧是必需的。

UPD:您可以在非原子上下文中使用kmap而不是kmap_atomic

+1

OP說他已經有了一個'struct page',爲什麼他需要精確映射它? (順便說一句:http://lwn.net/Articles/356378/; kmap_atomic的第二個參數在2009年有一段時間消失了) – Mat 2012-04-04 13:06:38

+0

嗯,在處理HighMemory時有一些限制。通用32位內核只能看到1G的內存(在0xc000000之後)。所以想象你有更多的4G內存。你如何從內核訪問它? – 2012-04-04 13:16:42

相關問題