如何找出內核空間的內存映射? VA - > PA內核虛擬內存如何映射到物理內存
我知道了proc
文件系統/proc/pid/maps
& /proc/pid/mappings
這讓我們的用戶空間應用的映射。類似於查找內核空間映射的內容?
謝謝!
如何找出內核空間的內存映射? VA - > PA內核虛擬內存如何映射到物理內存
我知道了proc
文件系統/proc/pid/maps
& /proc/pid/mappings
這讓我們的用戶空間應用的映射。類似於查找內核空間映射的內容?
謝謝!
下面是部分答案,也許會有所幫助。
Linux將內核虛擬地址空間分爲兩部分 - lowmem和vmalloc。
Lowmem在虛擬地址和物理地址之間使用1-1映射。即虛擬地址X被映射到物理地址X-C(其中C是某個常數,例如3GB)。這個映射是在啓動時建立的,並且永遠不會改變。
Vmalloc根據需要使用動態映射。在每次分配時,都會找到一堆物理頁面和一個虛擬地址範圍,並修改分頁表以創建映射。
兩個虛擬地址分隔。各自使用不同的虛擬地址範圍。 lowmem範圍始終映射,vmalloc範圍在分配時映射。
感謝您的解釋。我如何找到Lowmem的範圍?我設法找到你正在談論的常量,它被定義爲0xC0000000的PAGE_OFFSET – kimi
實際上,kernelspace分爲低和高內存(vmalloc區域是高內存的一部分)。正如ugoren所說,lowmem是直接映射,是在引導時建立的。例如,可以使用高內存來使用kmap(pkmap區域)映射某些用戶空間頁面。 下面是更詳細的圖片,您可以在引導時在內核日誌中找到它。 實施例:
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
vmalloc : 0xf7ffe000 - 0xff7fe000 (120 MB)
lowmem : 0xc0000000 - 0xf77fe000 (887 MB)
.init : 0xc0906000 - 0xc0973000 (436 kB)
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
在分爲887對120高MEM低MEM這個例子中1Gb的內核空間。正如您可以看到vmalloc區域佔用120 MB大容量內存,並且僅爲pkmap和fixmap區域保留2 Kbs和3 Kbs。關於fixmaps,你可以在這裏閱讀http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html。
有點過時,但仍然相關:http://www.tldp.org/LDP/tlk/mm/memory.html。 –
你的實際問題是什麼? –
http://books.msspace.net/mirrorbooks/linuxsystems/images/059600222X/figs/bels_0206.gif – MDMoore313