2014-12-30 35 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

我想我找到了原因:-)查看我的编辑。 –

相关问题