Chinaunix

标题: 关于ZONE_HIGHMEM [打印本页]

作者: ljshan    时间: 2009-02-23 13:35
标题: 关于ZONE_HIGHMEM
<<情景分析>>中说mem_map指向系统中所有的物理内存页面描述符数组,但是ULK 8.1.6中又说"Page frames above the 896 MB boundary are not generally mapped in the fourth gigabyte of the kernel linear address spaces, so the kernel is unable to directly access them. "。那么mem_map是不是将HIGHMEM也包括进来了呢?HIGHMEM该如何理解?
作者: Godbach    时间: 2009-02-23 13:48
HIGHMEM的映射要做特殊的处理才能映射
作者: ljshan    时间: 2009-02-23 13:59
原帖由 Godbach 于 2009-2-23 13:48 发表
HIGHMEM的映射要做特殊的处理才能映射


是不是Highmem的内存页不在mem_map数组中?
作者: Godbach    时间: 2009-02-23 14:12
原帖由 ljshan 于 2009-2-23 13:59 发表


是不是Highmem的内存页不在mem_map数组中?


具体的处理方式我既不清楚了。建议看一下ULKv3中相关章节,有介绍的。
作者: qtdszws    时间: 2009-02-23 14:28
>>是不是Highmem的内存页不在mem_map数组中?

在,所有的页都在
作者: scutan    时间: 2009-02-23 14:45
原帖由 ljshan 于 2009-2-23 13:35 发表
中说mem_map指向系统中所有的物理内存页面描述符数组,但是ULK 8.1.6中又说"Page frames above the 896 MB boundary are not generally mapped in the fourth gigabyte of the kernel linear address spaces, s ...


mem_map将高端内存包包含进来了,所以对于高端内存可以使用alloc_page这类函数去分配内存。

但是为什么需要高端内存呢?

因为对于32位系统来说, 逻辑地址为0-4G, 但是内核态只使用了3-4G的地址空间, 所以说内核只能管理1G的线性地址空间, 如果说全部都采用固定映射的方式, 即差一个PAGE_OFFSET的值. 这样, 如果内存大小超过了1G, 则不能够对超过的内存进行映射管理, 因为对线性地址来说已经超过了4G的大小.
所以, 内核就预先留了128M的逻辑地址空间去管理那超过的部分内存. 也即是说从内核线性地址的3G+896M开始的线性地址空间去管理物理内存896M之后的部分. 具体的管理方式有3种(ULK上面有讲解).

这只是一个设计的问题,对于64位系统来说,就不存在这个问题了。

BTW: 我以前看内存管理的时候也对这个问题很迷惑。后来慢慢积累就有了一点了解。
作者: scutan    时间: 2009-02-23 14:47
楼主看看这个贴子,以前思一克版总结的:
http://www.chinaunix.net/index.p ... read.php?tid=690010




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2