[英]How to get the physical address of the associated data from a struct page?
假設我們從頁面緩存文件的地址空間中獲得了一個struct page
。
我們如何從這個struct page
中獲取 4KB 數據的起始物理地址?
我想struct sk_buff
中應該有類似data
指針的東西,但我沒有找到它。
編輯
感謝 Mat 和 llya 的回答。
看了答案,我覺得第一個問題就是判斷struct page
是在ZONE_NORMAL
還是ZONE_HIGHMEM
。
在文件 I/O 期間,當我們找不到緩存頁面時,我們將首先使用page_cache_alloc_cold()
分配一個新頁面。 page_cache_alloc_cold()
最終會調用alloc_pages()
,看起來它將使用ZONE_HIGHMEM
(在 x86 中,是從PAGE_OFFSET
+896M 開始的 kernel memory 區域)。
所以
ZONE_NORMAL
中的頁面kmap()
來查找與結構頁關聯的 4KB 數據的起始物理地址,我們應該使用(unsigned long)(&page)-PAGE_OFFSET
來查找存儲結構本身的物理地址是否正確?請改正。
你需要把 map 一個page
變成 kernel memory 如下:
void * mapping = kmap_atomic(page, KM_USER0);
// work with mapping...
kunmap_atomic(mapping, KM_USER0);
這個技巧是必需的,因為 Linux 中有一個HighMemory
概念(例如,請參見此鏈接)。
UPD:您可以在非原子上下文中使用kmap
而不是kmap_atomic
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.