簡體   English   中英

內核虛擬內存如何映射到物理內存

[英]How is kernel virtual memory mapped to physical memory

如何找到內核空間的內存映射? VA - > PA

我知道proc文件系統/proc/pid/maps/proc/pid/mappings ,它為我們提供了用戶空間應用程序的映射。 有什么類似於查找內核空間映射的東西嗎?

謝謝!

這是一個部分答案,也許會有所幫助。

Linux將內核虛擬地址空間划分為兩部分 - lowmem和vmalloc。

Lowmem使用虛擬和物理地址之間的1-1映射。 即,虛擬地址X被映射到物理地址XC(其中C是一些常數,例如3GB)。 此映射是在引導期間構建的,永遠不會更改。

Vmalloc根據需要使用動態映射。 在每次分配時,找到一堆物理頁面和一個虛擬地址范圍,並修改分頁表以創建映射。

兩個由虛擬地址分隔。 每個使用不同的虛擬地址范圍。 始終映射lowmem范圍,分配時映射vmalloc范圍。

實際上,內核空間分為LOW和HIGH內存(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)

在這個例子中,1Gb內核空間分為887低mem和120高mem。 正如您可以看到vmalloc區域占用120 MB的高內存,而pkmap和fixmap區域僅保留2和3 Kbs。 關於修復映射,你可以在這里閱讀http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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