簡體   English   中英

如何從結構頁中獲取關聯數據的物理地址?

[英]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 區域)。

所以

  • 我認為 Mat 的答案適合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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM