操作系统内存映射

来源:互联网 发布:经典翻拍知乎 编辑:程序博客网 时间:2024/06/04 19:37

简单地说可访问内存总数是由CPU/[北桥/内存控制器]/主板布线(如果JS偷工减料的话)的地址总线宽度和操作系统来决定的。奔腾以后的CPU至少有36条地址总线,所以奔腾以上的32位CPU至少在64G是没问题的(但由于寄存器是32位的,所以可线性访问的只有4G,其他的需要通过页面切换(PAE)才能完成)。

PC机内存空间640K~1M(000A0000~000FFFFF)是BIOS,1G高端是ACPI/PCICFG等的保留空间(3FE8AC00~3FFFFFFF),对于连接到PCI设备:I/O空间被映射到很大的物理地址区间。这种设备的处理比较简单。

在接近4G高端( E8000000~EFFFFFFF)是显存页面的映射(类似于DOS的A0000~BFFFF)(其大小由BIOS SETUP里面的AGP SIZE决定),很显然这部分空间已经被用,所以即使有4G内存这部分内存空间也是无法被直接使用的(这和DOS只有640K常规内存而不是1M是一个道理)。

现代操作系统:

高端与低端内存

内核(在x86架构中)将4GB的虚拟地址空间分割为用户空间和内核空间。
一个典型的分割是将3GB分配给用户空间,1GB分配给内核空间。

占用内核地址空间最大的部分是物理内存的虚拟映射,
内核无法直接操作没有映射到内核地址空间的内存。

低端内存:
         只有内存的低端部分拥有逻辑地址。内核的数据结构必须放置在低端内存中。
高端内存:
         除去低端内存的剩余部分没有逻辑地址。它们处于内核虚拟地址之上。


低端内存(1GB的内核空间):

ZONE_DMA 包括低于16M的空间(映射到高端内存第四个GB) ,DMA使用ISA或者PCI系统总线传输数据ISA只能访问低段有限内存,无法访问高端内存,但是属于淘汰产品,只是部分主板还有接口)  

                解释: 在实际操作中,一些设备和一些系统中的高端内存不能用于DMA,
                            这是因为外围设备不能使用高端内存的地址。

                            对于有限制的设备,应使用GFP_DMA标志调用kmalloc或者get_free_pages从

                            DMA区间分配内存。另外,还可以通过使用通用DMA层来分配缓冲区。 (具体的查看另一篇)

ZONE_NORMAL 包括高于16M且低于896M的空间  (映射到高端内存第四个GB)

ZONE_DMA 和ZONE_NORMAL构成内核运行的空间,里面的具体分布,不同的系统不一样。                            用户进程需要访问系统空间的话,调用系统函数,取得内核地址空间。

ZONE_HIGHMEM  高于896M的空间且低于1GB的空间里面,也就是最后的128M中一部分映射高端内存(他们通过三种方式:永久映射、临时映射、非连续映射等,可以实现同时对高端内存的访问),一部分映射I/O口、PCI等其他设备。

896这个数字来自与经验,mips的就是512,根据实际改