>>> 此貼的回復 >> 如果我們擁有一個邏輯地址,可通過定義在 中的宏 _ _pa() 返回與其關聯的物理地址。我們也可以使用 _ _va() 宏將物理地址映射回邏輯地址,但只能用於低端內存頁。
>>> 此貼的回復 >> 用page_address宏
>>> 此貼的回復 >> 從全局變量mem_map[]數組中搜索出該page的數據結構,那個下標就是物理頁面的序號,所以在低位補上12個0之後就是物理頁面的起始地址了。不知道是不是這樣?
參考:中第42頁的一句話:內核中有個全局變量mem_map,整個數組就代表著全部物理頁面。因此,頁面表項的高20位對於軟件和MMU硬件有著不同的意義。對於軟件,這是一個物理頁面的诒,將這個用作下標就可以從mem_map找到代表這個物理頁面的page數據結構。對於硬件,則在低位補上12個0後就是物理頁面的起始地址。
>>> 此貼的回復 >> page_address(struct page *); 返回的就是page->virtual 即內核虛擬地址
如果頁是屬於ZONE_NORMAL 或者 ZONE_DMA 返回的就是內核邏輯地址, 和物理地址差一個常熟