momo zone

调核人的blog

为什么32bit kernel要把896MB以上物理内存定义为高端内存

为什么内核把高端内存的分界设置在物理内存的896MB处??这个问题确实很令人迷惑。接下来一步步思考来搞明白它:

1. 首先32bit 系统最大物理寻址范围4GB ,这个地球人都知道。但是在操作系统支持的保护模式下这个4GB是虚拟地址。你问我为啥??难道不记得X86中的cr3寄存器(用来放页目录基址),也就是说内核发出的任何地址都需要cpu解码成物理地址,当然这个是硬件完成的。

2. 如果上面的还好理解那么下面的只有了解内核结构的底层开发者才好理解。

linux的设计者需要一个多进程多任务的os,并希望这4GB虚拟地址空间能够充分利用,那么就对虚拟内存作了一个简单的分割:0-3GB 给ring3 用作用户进程空间,3-4GB给ring0 用作内核空间。而内核空间中除了内核镜像(当然它也在物理空间中)其余就都给去映射物理空间了。对于物理内存,内核在设计时,实际可以直接访问的物理内存就最大只有1GB(原因:内核固定页表数限制)。注意内核和用户程序有不同的页目录和页表,前者不能变更,后者可以随意变更。

3.后来PC的物理内存突破了1GB,这可让linux的设计者挠破了头,因为内核就是基于最大1GB物理内存设计的。linux的设计者必须再设计一个额外的机制来支持1GB以上内存的访问,并能够兼容旧的小于1GB内存的系统。最终解决办法是把1GB的内核空间内再划分出128MB用来映射(可变映射)高于1GB的物理内存。这128MB映射区最大只能映射高端内存中某个区域的128MB空间。 如果要映射高端内存中的另外一段空间,就要先取消映射,再建立映射,相当繁琐。最后kernel的内核空间布局就这样了:划出128MB意味着内核空间的固定映射区缩小为896MB,也就是说896MB以上的内存都不能直接访问了(不在内核固定映射区)。

4.最后还有重要的一点,就是896MB以上高端内存仅仅是针对内核程序而言,用户程序有自己的页表,完全可以修改并直接映射到任意物理地址

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: