2014-12-30 34 views
0

爲什麼給定的虛擬地址(只是一個例子):最大/最小物理地址 - Linux內核

虛擬地址ffffffffa08f9533對應的物理地址:0x24a5adff8

我只有0x200000000(8GB)物理內存量(假設第一個地址爲零 - 可能是錯誤的假設),所以返回的物理地址不在我真實的物理內存中。我究竟做錯了什麼?

我使用的功能是:

virt_to_phys & phys_to_virt

感謝

+0

我懷疑*的」虛擬地址'ffffffffa08f9533'對應的物理地址:'0x24a5adff8 '「*。它們甚至不在相同的字節邊界上!你不需要一個字節的頁面大小來獲得未對齊的映射嗎? – sawdust

+0

這實際上是一個訪客虛擬地址(某些正在運行的用戶進程 - 在虛擬機管理程序下),因此地址確實有意義。編輯:這不是重點。看看下面的答案。 – Rouki

+0

虛擬機與裸機或實內存與內存映射設備寄存器無關:虛擬內存映射不是字節地址。映射(表)是虛擬內存頁面地址的物理內存頁面地址。你能提供這個系統文件'/ proc/iomem'的內容嗎? (使用[edit](http://stackoverflow.com/posts/27706618/edit)將它添加到上面的原始問題中。) – sawdust

回答

0

電腦具有不涉及真正的RAM一些地址空間。幾天前,我安裝了4GB內存的顯卡。但是PC中還有其他設備可以使用自己的內存,CPU仍然可以訪問:RAID控制器,網卡,支持DMA的I/O卡。

在64位以前的時間內,這些內存區域必須映射到RAM的物理地址空間的某處。這意味着你可以在你的電腦上安裝超過3.5GB的內存,但你無法使用它。

使用64位CPU時,現在可以將所有這些存儲區映射到真實/普通RAM之外的某個位置。

在Linux上,你可以得到64位物理內存的當前佈局/proc/iomem

相關:Getting memory map of every device in linux

+0

Ehm,這不是我問的。我正在將內核虛擬地址轉換爲內核物理地址,並且我收到的地址大於我的最大內存大小(如上所述爲8gb)。 – Rouki

+0

啊,'0x24a5adff8'超出範圍。你可以訪問虛擬地址而不會崩潰你的程序? –

+0

我想我找到了原因:-)查看我的編輯。 –

相關問題