免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: comepu

内核的地址是简单的线性映射这句话怎么理解啊? [复制链接]

论坛徽章:
0
发表于 2005-12-05 15:24 |显示全部楼层
原帖由 Solaris12 于 2005-12-5 13:21 发表


这么说,内核的内存基本在NORMAL zone了。
是不是正是由于这个原因,linux才需要划分出HIMEM zone呢?

这样做有什么优劣?

好处:
简单?高效?

不利:
这样做岂不是限制了对大内存的使用?


大内存本来就没有什么用,不能直接用来寻址的,而是向内核的896以上的那么个128M里面映射,由点象原来的那么个XMS.也就是1M以后的内存不是直接用,而是映射到640K到1M之间的机制差不多,吸吸。

论坛徽章:
0
发表于 2005-12-05 15:36 |显示全部楼层
原帖由 comepu 于 2005-11-15 09:14 发表
对物理地址来说,给定一个虚地址x,其物理地址就是x-page_offset 。
还有这行代码
asm volatile("movl %0,%%cr3"::"r"(_pa(next->pgd)));
说明一个虚地址直接减去位移就得到物理地址了 ...

对于者个问题,确实是这么个问题,不过LINUX不会用那么多的那。

论坛徽章:
0
发表于 2005-12-05 23:12 |显示全部楼层
原帖由 menp9999 于 2005-12-5 15:24 发表


大内存本来就没有什么用,不能直接用来寻址的,而是向内核的896以上的那么个128M里面映射,由点象原来的那么个XMS.也就是1M以后的内存不是直接用,而是映射到640K到1M之间的机制差不多,吸吸。



你说的似乎不对。在solaris x86内核里就没这个概念。 HIMEM zone应该不是由硬件限制而搞出来的,而是LINUX自己的实现机制导致的。


我怀疑就是因为内核物理地址和线性地址这种简单对应关系造成的这种限制。

谁了解的话,说说,我也是刚开始学LINUX

论坛徽章:
0
发表于 2005-12-06 09:25 |显示全部楼层
原帖由 Solaris12 于 2005-12-5 23:12 发表



你说的似乎不对。在solaris x86内核里就没这个概念。 HIMEM zone应该不是由硬件限制而搞出来的,而是LINUX自己的实现机制导致的。


我怀疑就是因为内核物理地址和线性地址这种简单对应关系造成的这种限 ...


大内存的确不能直接寻址啊 。
起用了保护模式之后,寻址都要走MMU,都要有页表。 32cpu,总共就4g的线性地址空间可用,只好做为一种紧缺资源来与物理地址相映射。 linux的normal区是挺大的,可是别的os也得有个normal区吧?否则中断例程给swap出去了怎么办?我觉得操作系统内核中必须保证一部分区域是不可交换的。

安全界的朋友说windows没有normal区,都是分页的,这个我不太相信,呵呵

论坛徽章:
0
发表于 2005-12-06 10:45 |显示全部楼层
关注

论坛徽章:
0
发表于 2005-12-06 11:48 |显示全部楼层
RedHat 公司的Ingo Molnar有一个4G/4G补丁, 打了这个补丁后,内核与应用进程使用不同的页表。这样IA32的寻址能力就被发挥到硬件极限了。
原来的linux,当应用程序被硬件中断时,穿越中断门切换入内核态,CR3寄存器(存放task_struct->mm_struct->pgd)不需要改变;4G补丁下,CR3就要改变,因为要使用另一套地址空间。

论坛徽章:
0
发表于 2005-12-06 13:35 |显示全部楼层
原帖由 Solaris12 于 2005-12-5 23:12 发表



你说的似乎不对。在solaris x86内核里就没这个概念。 HIMEM zone应该不是由硬件限制而搞出来的,而是LINUX自己的实现机制导致的。


我怀疑就是因为内核物理地址和线性地址这种简单对应关系造成的这种限 ...




没有这个概念也许是因为他不支持超过4G的内存,或者他采用其他的方法,但是不能直接寻址是肯定的,这是没有办法的事情,因为32位的寻址能力的限制.当然如果你使用的64位操作系统是不需要这个概念.好象64位的LINUX也用不着(在开发64位的LINUX么?)

[ 本帖最后由 menp9999 于 2005-12-6 13:36 编辑 ]

论坛徽章:
0
发表于 2005-12-06 13:58 |显示全部楼层
原帖由 menp9999 于 2005-12-6 13:35 发表




没有这个概念也许是因为他不支持超过4G的内存,或者他采用其他的方法,但是不能直接寻址是肯定的,这是没有办法的事情,因为32位的寻址能力的限制.当然如果你使用的64位操作系统是不需要这个概念.好象64位的L ...



首先,solaris x86默认支持x86的PAE mode,因此可以在32位系统上支持超过4G的内存。

其次,amd64和其它64位cpu一样,内核应该是有独立的地址空间的,不需要利用3G以上的线性地址空间。这个是硬件就提供的,linux和solaris应该都差不多。

我有两个疑问:

1.32位x86支持超过4GB的内存和是否需要划分zone normal,zone himem应该无关吧?

2.而且,内核内存不分页和不换出这个也和划分zone normal,zone himem无关吧?我的意思是不需要这么划分也能实现这个。


谁能清楚的解答我的两个疑问?


我也会抽空查查资料,看到底是怎么回事。

论坛徽章:
0
发表于 2005-12-06 15:47 |显示全部楼层
原帖由 albcamus 于 2005-12-6 09:25 发表

大内存的确不能直接寻址啊 。
起用了保护模式之后,寻址都要走MMU,都要有页表。 32cpu,总共就4g的线性地址空间可用,只好做为一种紧缺资源来与物理地址相映射。 linux的normal区是挺大的,可是别的os也得有个normal区吧?否则中断例程给swap出去了怎么办?我觉得操作系统内核中必须保证一部分区域是不可交换的。

安全界的朋友说windows没有normal区,都是分页的,这个我不太相信,呵呵


32位x86的虚拟内存地址空间只有4GB,而内核又没有独立的地址空间,只好把物理内存映射在3G-4G的范围内。这样用户进程就不可能有真正的4G地址空间了。

我总觉得linux划分出normal和himem只是自己的一种实现,这种实现未必就有这个必要。如果内核的物理地址到虚拟地址的转换和用户进程一样,linux就可以把任意位置的物理内存影射到3G以上的内核占用的线性地址空间。

所以本质上,根本zone normal和zone himem只是linux为解决内核和用户进程公用线性地址空间的一种解决方案而已。

至于内核的内存不能换出和不能分页,是另一个问题,和本问题无关。

这是我的理解,如果有错误,fix me

论坛徽章:
0
发表于 2005-12-06 16:30 |显示全部楼层
>> 1.32位x86支持超过4GB的内存和是否需要划分zone normal,zone himem应该无关吧?
是的。不过个人感觉现在的方案就比较漂亮了。

>> 2.而且,内核内存不分页和不换出这个也和划分zone normal,zone himem无关吧?我的意思是不需要这么划分也能实现这个。
是的。但是我觉得一个操作系统内核总得有某块是不可换出到交换分区或交换文件的,在linux下,就把这块内存命名为ZONE_NORMAL
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP