LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2340|回复: 15

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

[复制链接]
发表于 2005-9-14 20:59:03 | 显示全部楼层 |阅读模式
在看讲Linux内核的书,但是遇到个问题,想不通,问问大家。谢谢。

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

哪位大哥能解释一下吗?谢谢!
发表于 2005-9-14 21:07:25 | 显示全部楼层
3G分给了用户空间, 还剩1G留给内核。
这1G不能全用来印射物理内存,要留一些给highmem, vmalloc, ioremap, 所以就只有896M了
回复 支持 反对

使用道具 举报

发表于 2005-9-14 22:16:00 | 显示全部楼层
Post by daemeon
3G分给了用户空间, 还剩1G留给内核。
这1G不能全用来印射物理内存,要留一些给highmem, vmalloc, ioremap, 所以就只有896M了

说说高于896M的空间是怎么用的吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-14 22:17:36 | 显示全部楼层
谢谢daemeon的解释,不过还是有点不解。

我把在《深入理解Linux内核》存储器管理区那一页先抄下来,再说说我的不理解的地方。

在一个理想的计算机体系结构中,一个页框就是一个存储器存储单元,可用于任何事情:存放内核数据和用户数据、缓存磁盘数据等等。任何种类的数据页都可以存放在任何页框中,没有什么限制。

但是,实际的计算机体系结构有硬件的制约,这限制了页框可以使用的方式。尤其是,Linux内核必须处理80x86体系结构的两种硬件约束:
    ISA总线的直接存储器(DMA)处理器有一个严格的限制:它们只能对RAM的前16MB寻址。

    在具有大容量RAM的现代32位计算机中,CPU不能直接访问所有的物理存储器,因为线形地址空间太小。

为了应付这两种限制,Linux把物理存储器划分为三个管理区(zone):

ZONE_DMA:包含低于16MB的存储器页


ZONE_NORMAL:包含高于16MB且低于896MB的存储器页


ZONE_HIGHMEM:包含高于896MB的存储器页


ZONE_DMA区包含的页可以由老式基于ISA的设备通过DMA使用。

ZONE_DMA和ZONE_NORMAL和区包含的存储器的“常规”页,通过把它们线性地映射到线性地址空间的第4个GB,内核就可以直接进行访问。相反,包含的存储器页不能由内核直接访问,但它们也线性映射到了线性地址空间的第4个GB。在64位体系结构上没有使用在64位体系结构上没有使用ZONE_NORMAL。

(第二版 p226)


Post by daemeon
3G分给了用户空间, 还剩1G留给内核。
这1G不能全用来印射物理内存,要留一些给highmem, vmalloc, ioremap, 所以就只有896M了


你说的这个好像是线性地址空间的划分吧,把第4个GB的线性空间划分给了内核。但是“存储器管理区”说的好像是对物理内存页框的管理问题。
我不理解的是,为什么内核不能访问高于896MB以上的物理内存,我想象中的却是32条地址线,应该可以访问4GB物理内存中的任何地方。
回复 支持 反对

使用道具 举报

发表于 2005-9-14 22:30:52 | 显示全部楼层
Post by freesky64

我不理解的是,为什么内核不能访问高于896MB以上的物理内存,我想象中的却是32条地址线,应该可以访问4GB物理内存中的任何地方。

如果没有highmem,事实上只能访问小于1G的物理空间,因为内核空间3--4G是与物理空间0--1G直接映射的,而内核只有1G的空间,所以也只能映射一个G的物理空间.
回复 支持 反对

使用道具 举报

发表于 2005-9-14 22:51:51 | 显示全部楼层
<<Understanding the Linux Virtual Memory Manager>>里的插图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-14 23:29:48 | 显示全部楼层
daemeon,对不起,我觉得是不是你对我的问题理解错了.

这个896MB的"高端内存"问题,应该是内核对物理内存管理、使用的问题,而不是线性地址空间(虚拟地址)划分的问题吧?

刚才由查了查《Linux内核设计与实现》这本书谈及此的部分,其中说:“ZONE_HIGHMEM这个区包含‘高端内存’,其中的页并不能永久地映射到内核地址空间”。这也表明说的是“高端内存”(物理内存)不能直接被Linux内核使用的。

而不是分给内核使用的3~4G的那1G虚拟地址空间只能使用其中的896MB问题呀,而是物理内存的使用问题吧?!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-14 23:37:02 | 显示全部楼层
Post by rickxbx

如果没有highmem,事实上只能访问小于1G的物理空间,因为内核空间3--4G是与物理空间0--1G直接映射的,而内核只有1G的空间,所以也只能映射一个G的物理空间.


0~1G的物理空间直接与内核空间的3~4G线性地址空间映射,用户程序内存映射到哪儿去了?

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

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

使用道具 举报

发表于 2005-9-14 23:37:48 | 显示全部楼层
虚拟地址划分于内存管理是有联系的哦!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-14 23:40:32 | 显示全部楼层
Post by daemeon
虚拟地址划分于内存管理是有联系的哦!

可以略作解释吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

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