天天看點

如何将虛拟位址轉化成pfn,即頁幀号

如何将虛拟位址轉化成pfn,即頁幀号(就是mem_map數組下标,就是所有的實體頁描述結構的數組,通過這個數組就可以找到struct page)

核心中虛拟位址,隻是在實體位址上加了個PAGE_OFFSET,這個東西在x86上是3G,隻要拿核心中的虛拟位址直接減3G就行

使用者程式中的虛拟位址,靜态的是編譯時就定好的,動态的(如malloc),是通過核心的頁式記憶體管理在vma中定的,需要找到程序的task_struct中的頁表然後一級級的翻譯得到實體位址。

實際編譯時定的位址叫做邏輯位址,這個邏輯位址是需要段式管理來翻譯的,即段基址加段内偏移,由于linux中的這個段基址就是0,是以邏輯位址就直接對應了虛拟位址了。

這樣得到實體位址以後,首先将十六進制的低三位與成0,這樣做是得到頁的實體位址,這裡指4K頁的情況,然後通過頁的實體位址減去mem_map的第一個元素的位址就得到了此頁在mem_map數組中的下标(此處注意指針相減不是指針表示的位址相減,而是兩者之間指針所表示元素類型的個數),此下标即為pfn,知道了在數組中的下标就可以得到struct page結構體了,就可以知道page的所有情況了。

繼續閱讀