LINUX 内核虚拟地址空间到物理地址空间的疑问

u010182242 2014-08-20 12:16:45
最近在看关于内存的东西,有个疑问望大神指点,书上举的例子内存都很小,像512M的,1G的都说的好大好大了,所以我怀疑是不是我看的书太老了还是怎么的,总是与实际连接不起来,就拿我的电脑来说,内存是2G的,那这种情况下内存映射是怎么运作的?
资料上说:“假如是512M内存,那么从3G开始,到3G + 512M 为连续固定影射区。”这个我还能理解,因为总空间小于4G,32位还是能容纳。但是我就想:我笔记本内存是2G,那照这样说来,映射的地址是从3G~5G?32机器怎么能寻址5G的空间?
还有好多疑问啊。。。。。。。。
望大神指点迷津,欢迎加好友交流!!!
...全文
928 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zy1306 2014-11-24
  • 打赏
  • 举报
回复
x86 CPU有36位物理地址线
u010182242 2014-11-06
  • 打赏
  • 举报
回复
引用 6 楼 binaryhead 的回复:
有空看看我这篇博文,希望能对你们有帮助! http://blog.csdn.net/binaryhead/article/details/40708397
大神 牛B 稍微看了下很多概念对我很有用 抽时间认真读一下 先谢啦
u010182242 2014-11-06
  • 打赏
  • 举报
回复
引用 5 楼 xuezhongfenfei 的回复:
我也是linux内存的地址空间映射一直弄不清楚,虽然书中说的很清楚,但是还是会糊涂,楼主清楚了没?交流下?
模糊中
二进制脑袋 2014-11-06
  • 打赏
  • 举报
回复
引用 13 楼 u010182242 的回复:
[quote=引用 6 楼 binaryhead 的回复:] 有空看看我这篇博文,希望能对你们有帮助! http://blog.csdn.net/binaryhead/article/details/40708397
大神 牛B 稍微看了下很多概念对我很有用 抽时间认真读一下 先谢啦 [/quote] 有用是对我原创劳动的最高回报!(当然我也是参考各种资料的,但内容完全是我自己的理解重新组织的,用心阅读,和其它别人以前类似主题文章对比一下自有答案)
猪头三小队长 2014-11-04
  • 打赏
  • 举报
回复
去求证吧,很乐于改正自己理解不正确的地方,正好我最近也要学习下x86和arm下的虚拟内存管理细节,印证一下以前所学和理解是否贴合实际。
二进制脑袋 2014-11-04
  • 打赏
  • 举报
回复
引用 9 楼 xinzha 的回复:
内核自然是在那896M范围之内,内核也要装载到内存之中。。。,如果你在内核中多看些打印的log,会发现所有的内核代码和数据结构的逻辑地址就在0xc0000000之后的这段区域。
我当然知道内核在“0xc0000000之后的这段区域”的虚拟地址范围内,因为内核只能位于0xc0000000-0xffffffff。问题是,按照你的意思,合理的推论就是,即使安装了2G或4G物理内存的机器上,32位Linux内核,内核实际上只能位于物理内存的低896M范围之内。是这样的吗,恐怕需要求证!因为我没有研究过Linux内核的内存分配管理细节,不过我还是怀疑这样管理的灵活性,虽然32 Linux如果真这样实现的话或许更简化、更省事。
猪头三小队长 2014-11-04
  • 打赏
  • 举报
回复
内核自然是在那896M范围之内,内核也要装载到内存之中。。。,如果你在内核中多看些打印的log,会发现所有的内核代码和数据结构的逻辑地址就在0xc0000000之后的这段区域。
二进制脑袋 2014-11-03
  • 打赏
  • 举报
回复
引用 7 楼 xinzha 的回复:
在32位系统中,不考虑会有硬件占用大量内核虚拟内存空间的情况,如果你是2G的内存,占用的物理空间假设是0~0x7fffffff,内核会将0到896M,也就是说0~0x37ffffff这一部分直接映射到可直接寻址的内核逻辑地址上(固定映射),也就是0xc0000000~0xf7ffffff。这样就留下了128M的虚拟地址空间可以动态的进行映射,当固定映射的内存不够用,或者请求者指定要求获得high memory时,就会动用这128M的动态虚拟地址,让它去映射到那(2048 - 896 = 1152M)的物理内存上去。 在上面所说的情况下,比方说有两个进程A和B,当这两个进程陷入内核态时,所看到的0xc0000000~0xf7ffffff的内容是一致的,因为这部分地址使用的是固定映射,对于所有进程来说没有区别,而最高的128M地址空间,多数情况下对于两个进程来说应该是不一样,因为动态映射的原因,它们映射到那1152M物理内存的不同页框中。 实际情况当然会更加复杂,因为有大量的硬件设备会挤占掉一部分内核虚拟地址空间,不过基本原理就是这样的。 这部分内容可以在《深入理解Linux内核》里找到,多读几遍就行了。
虽然我不了解Linux内核,但如你所说内核虚拟地址空间的0xc0000000~0xf7ffffff已经固定映射到物理内存的低896M了,剩下的128M还留给动态映射。那么请问操作系统内核代码、内核驱动程序、内核堆以及内核维护的数据结构放哪里?请给他们找个位置吧! 64位Linux的虚拟地址空间见:https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt 我目前对32位Linux不是很有兴趣,但很显然,内核只是拿出一部分空间作为直接映射所有物理内存这一基本设计原则是不会变的,虽然64位条件下64TB直接映射空间在可预见的将来足以完成所有对实际物理内存的完整映射,而32位条件下(在安装大容量内存条件下)只能实现对物理内存的部分、窗口式映射。
猪头三小队长 2014-11-03
  • 打赏
  • 举报
回复
在32位系统中,不考虑会有硬件占用大量内核虚拟内存空间的情况,如果你是2G的内存,占用的物理空间假设是0~0x7fffffff,内核会将0到896M,也就是说0~0x37ffffff这一部分直接映射到可直接寻址的内核逻辑地址上(固定映射),也就是0xc0000000~0xf7ffffff。这样就留下了128M的虚拟地址空间可以动态的进行映射,当固定映射的内存不够用,或者请求者指定要求获得high memory时,就会动用这128M的动态虚拟地址,让它去映射到那(2048 - 896 = 1152M)的物理内存上去。 在上面所说的情况下,比方说有两个进程A和B,当这两个进程陷入内核态时,所看到的0xc0000000~0xf7ffffff的内容是一致的,因为这部分地址使用的是固定映射,对于所有进程来说没有区别,而最高的128M地址空间,多数情况下对于两个进程来说应该是不一样,因为动态映射的原因,它们映射到那1152M物理内存的不同页框中。 实际情况当然会更加复杂,因为有大量的硬件设备会挤占掉一部分内核虚拟地址空间,不过基本原理就是这样的。 这部分内容可以在《深入理解Linux内核》里找到,多读几遍就行了。
二进制脑袋 2014-11-02
  • 打赏
  • 举报
回复
有空看看我这篇博文,希望能对你们有帮助! http://blog.csdn.net/binaryhead/article/details/40708397
淡定的小Y 2014-10-19
  • 打赏
  • 举报
回复
我也是linux内存的地址空间映射一直弄不清楚,虽然书中说的很清楚,但是还是会糊涂,楼主清楚了没?交流下?
小陆zi 2014-09-09
  • 打赏
  • 举报
回复
0xc000 0000这是虚拟地址,和你的物理地址没有任何关系。至于你问的问题,怎么把2g的物理内存映射到4g的内存空间中。其实内核会为了所有的物理内存建立相应的页表和页目录。在你笔记本上就是2g的物理内存建立页表。同样这2g的空间就和512M的内存是一样的,连续,但是最小寻址分割为page(4096k)至于这些页表到底是给用户空间使用还是内核空间使用的。是有操作系统在运行的时候决定的。
fly 100% 2014-09-04
  • 打赏
  • 举报
回复
映射可以多个虚拟地址对应一个物理地址 也可以有空洞不做映射的部分存在的
ronliu 2014-08-24
  • 打赏
  • 举报
回复
intel中,大于896M的内存,作为高端内存。
colddown 2014-08-20
  • 打赏
  • 举报
回复
intel的32位处理器的PAE开启后可以访问4G以上内存。本质方法就是每一时刻建立的页表只访问一部分内存

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧