Linux 的 /proc/iomem 里面为什么有一部分不是物理地址?

2023-03-09 11:28:50 +08:00
 wniming
我之前一直以为 cat /proc/iomem 得到的都是物理地址,直到看到了同事给我发的这张图:

物理内存只有 8GB ,但内核代码和数据被加载到了 0x8800000000 这么大的地址上,这肯定不是物理地址,我不明白这个地址是处理器的虚拟地址还是内核高地址还是其他什么地址,而且也不理解 iomem 输出一个这样的地址有什么意义
1860 次点击
所在节点    Linux
8 条回复
x1596357
2023-03-09 11:40:44 +08:00
了解下操作系统的虚拟地址
wniming
2023-03-09 11:44:36 +08:00
@x1596357 能说详细一点吗?另外虚拟地址我非常了解
wniming
2023-03-09 11:57:04 +08:00
@x1596357 我现在如果想要知道内核代码和数据的物理地址要怎么看?
heiher
2023-03-09 11:57:39 +08:00
你说有没有可能存在一种地址空间即不叫物理,也不叫虚拟,并且物理内存(RAM)在该空间的映射不是从 0 开始的呢。
x1596357
2023-03-09 12:15:22 +08:00
@wniming 其他的硬件比如访问总线也是需要地址空间的,所以在 64 位的地址空间,在实际 CPU 是 48 bits 中分配给他们。不然就没办法访问他们。看看 https://stackoverflow.com/questions/13668490/getting-address-of-symbol-from-kernels-symbol-table 是不是你想要的。具体我也不清楚。
BingoXuan
2023-03-09 12:20:49 +08:00
是物理地址,只是不同总线影射的物理地址都不一样。要看 cpu 手册,不同 cpu 设计时候分配给不同总线的物理地址不一样。你以为的物理地址不过是内存总线影射的物理地址。
pipapa
2023-03-09 15:47:43 +08:00
把你的设备树 dump 下来看下,各个设备是怎么映射的就知道了。
TATQAQTAT
2023-03-09 16:17:47 +08:00
处理器的寻址空间很大,这个寻址空间就是我们所称的物理地址,其中不仅给随机存储器( RAM ,平常所称的内存)分配了一段地址用来访问,还有 ROM ,还有 PCI 设备映射到寻址空间的地址,还有其他一些外设的寄存器。
我认为可能是日常语境下把这个寻址空间叫做内存空间,但这个内存是用来指可以被直接寻址的空间,并不单指 RAM (随机访问存储器)造成的混淆

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/922525

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX