LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: freesky64

内核不能直接访问896MB以上的物理地址。怎么回事?

[复制链接]
发表于 2005-9-14 23:59:22 | 显示全部楼层
Post by freesky64
0~1G的物理空间直接与内核空间的3~4G线性地址空间映射,用户程序内存映射到哪儿去了?

如果小于1G范围内的物理内存有600MB被映射给了用户程序,那么小于1G的物理内存实际映射给内核的最多也只有424MB,内核还有600M的线性空间可以被映射啊,这一部分难道不能被映射到大于1G的物理内存上去?

还有896MB的限制是只针对内核吗?用户程序的线性空间可以直接映射到〉896MB范围的物理内存吗?

一个物理地址可以映射到不同的虚拟地址,所以用户程序所用的物理空间也可能出现在内核空间.
回复 支持 反对

使用道具 举报

发表于 2005-9-15 13:58:35 | 显示全部楼层
这应该和内存的分配和使用有关,对于高于896M的空间不能直接映射和保护。这个内存初始化的位图机构和页表有关系
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-16 17:12:08 | 显示全部楼层
谢谢,各位的帮助,我想我搞清楚这个问题了。

896MB以上的物理内存不能被内核直接访问,是因为0~896MB的物理内存是与内核的3G~3G+896MB顺序映射的,而内核剩下的虚拟地址空间还要为比如vmalloc区预留,所以不能再直接映射了,因此不能直接访问。而大于896MB的物理内存若需访问必须动态映射到内核空间里高端内存区。

这个896MB以上的只是不能直接访问,而不是说硬件不支持4G的物理空间,需要的时候还有动态映射的访问高端物理内存。

我理解得对吗?
回复 支持 反对

使用道具 举报

发表于 2005-10-9 10:21:02 | 显示全部楼层
Post by freesky64
谢谢,各位的帮助,我想我搞清楚这个问题了。

896MB以上的物理内存不能被内核直接访问,是因为0~896MB的物理内存是与内核的3G~3G+896MB顺序映射的,而内核剩下的虚拟地址空间还要为比如vmalloc区预留,所以不能再直接映射了,因此不能直接访问。而大于896MB的物理内存若需访问必须动态映射到内核空间里高端内存区。

这个896MB以上的只是不能直接访问,而不是说硬件不支持4G的物理空间,需要的时候还有动态映射的访问高端物理内存。

我理解得对吗?

光从你前几个帖子中摘录的那段话得不到用vmalloc动态映射的结论。
通常,内核虚地址空间的3-4G映射了全部0-4G的物理内存单元,这是由页目录表-页表结构决定并实现的。所以“0~896MB的物理内存是与内核的3G~3G+896MB顺序映射的”有问题。
在目前的操作系统中,对虚空间的管理就是对页目录表-页表的控制,所以你要理解虚存管理,那么从页目录表-页表入手最方便,也最彻底。
回复 支持 反对

使用道具 举报

发表于 2005-10-10 18:41:38 | 显示全部楼层
先ioremap,然后就能用了
回复 支持 反对

使用道具 举报

发表于 2005-11-13 09:43:54 | 显示全部楼层

解决办法

Post by freesky64
在看讲Linux内核的书,但是遇到个问题,想不通,问问大家。谢谢。

书上说,高于896MB的物理存储器被划分为Zone_Highmem区,其中包含的存储器页不能由内核直接访问。但是32的机器能够访问的物理内存不是应该是4G吗?

哪位大哥能解释一下吗?谢谢!



使用ck-sources,有1G内存的补丁。。。
或者打开“大量内存”的选项,不过不能使用VM-Ware了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表