linux中高端内存和低端内存的概念【转】

转自:http://blog.csdn.net/hdujinhuihui/article/details/8686817

高端内存是Linux中一个重要的概念,初涉Linux时曾经对这个概念非常迷惑。实际上这个概念比较简单,理解这个概念,需要追溯一下Linux的内存管理。

从前,CPU的地址总线只有32位。32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间,在物理上理论上最多拥有 4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的线性地址空间。为了合理的利用4G空间,Linux采用了3:1的策略,即内核占用1G的线性地址空间,用户占用3G的线性地址空间。所以用户进程的地址范围从0~3G,内核地址范围从3G~4G,也就是说,内核空间只能管理 1G的内存。对于如此紧张的线性地址资源,内核空间与用户空间的肆意瓜分,导致了内存管理上的问题:当物理内存大于1G时,内核线性地址空间小于实际的物理内存容量,内核如何实现对大于1G内存的管理呢?说到这里,需要提一下内核空间对内存的管理方法。一方面为了提高内核空间对内存的管理效率;另一方面,为了简化内核空间对内存的管理方法,内核采用线性映射的方法实现对内存的管理,从Linux实现的方法来看,物理地址与内核的虚拟地址只差一个偏移量。所以,当物理内存大于1G时,物理内存无法全部映射到内核线性地址空间,这就产生了上述问题。

从上述描述可以看出,地址空间大于1G的内存区域称之为高端内存,同理,小于1G的内存区域称之为低端内存。高端内存的管理需要进行非线性映射,为此,在内核线性地址空间预留了128M的空间,位于线性地址空间的高端。如今,CPU的地址总线都扩大到64位了,线性地址资源非常丰富,所以,可以给内核空间预留足够的线性地址资源,在最近一段时间内,内核线性地址资源与物理内存容量之间的矛盾将不再突出,高端内存的概念也就在64位CPU上消失了。

时间: 2024-08-16 01:29:22

linux中高端内存和低端内存的概念【转】的相关文章

高端内存与低端内存漫谈

[Linux 内核知识点讨论区.内存管理.  ] 低端内存与高端内存,在32位CPU中才会出现的概念,这是因为32位系统中,内核的地址空间是3G-4G(也可以配置成2G-4G,但不耽误理解高端内存与低端内存的概念).3G-4G,整个内核的虚拟地址空间就1G.1G的虚拟地址,怎么能够管理到实际2G.3G甚至是4G的物理地址呢?自然就想到了一种方法叫:从一一映射中拿出一部分的地址空间作动态的映射. 首先我们必须有常识:一一映射是天生的,是土著!所有的事物都有其发展史,很早以前没有虚拟地址物理地址的区

高端内存和低端内存

参考:http://blog.csdn.net/ghosc/article/details/6625277 高端内存是 Linux中的一个重要的概念,初涉Linux时曾对这个概念非常迷惑.实际上这个概念比较简单,理解这个概念,需要追溯一下Linux的内存管理 从前, CPU的地址总线只有32 位,再早的就不再追溯了.32 的地址总线无论是从逻辑桑还是从物理上都只能描述 4G 的地址空间,在物理上理论最多拥有 4G内存(除了IO 地址空间,实际内存容量小于4G ),逻辑空间也只能描述 4G 的线性

内存管理--检测内存

linux kernel被bootloader加载到内存后,cpu首先执行head.s中的start_of_setup函数等函数,然后跳转到main.c,main中首先执行detect_memory函数探测内存: int detect_memory(void) { int err = -1; if (detect_memory_e820() > 0) err = 0; if (!detect_memory_e801()) err = 0; if (!detect_memory_88()) err

linux高端内存的理解

在linux中,地址空间映射是这样的,把0xc0000000-0xffffffff这1GB内核地址空间划分成2个部分低端的796MB + 高端的128MB,低端796MB就使用f映射,直接映射到物理内存的前796MB上,而高端128MB就用来随时变更g来映射到物理内存超过796MB的范围上,这里对应了3种映射算法:动态映射,永久内核映射,临时映射. 说下"映射"是什么,其实就是x86的内存分页机制,我们只要通过修改分页的页表项就可达到更改 "映射" 的目的. 查看系

Linux 内核高-低端内存设置代码跟踪(ARM构架)

对于ARM中内核如何在启动的时候设置高低端内存的分界线(也是逻辑地址与虚拟地址分界线(虚拟地址)减去那个固定的偏移),这里我稍微引导下(内核分析使用Linux-3.0): 首先定位设置内核虚拟地址起始位置(也就是内核逻辑地址末端+1的地址)的文件:init.c (arch\arm\mm),在这个文件中的void __init bootmem_init(void)函数如下 void __init bootmem_init(void) { unsigned long min, max_low, ma

Linux高端内存

Linux高端内存是针对物理内存来说的,虚拟内存没有高端这个概念.Linux系统将虚拟内存分为两个部分,即用户地 址空间和内核地址空间,对于32位系统来说,虚拟地址空间为4GB,其中用户空间范围为0-3GB,内核空间范围为 3-4GB.Linux将3GB开始的内核虚拟地址空间的896M地址直接映射到物理地址空间的0-896M,这部分是永久性映 射,剩下的128M则可根据需要进行动态映射,也称临时性映射.如果没有动态映射,那么1GB的内核虚拟地址空间最 多只能访问1GB的物理内存,那么如果物理内存

Linux高端内存映射

概述 在32位的系统上,内核占有从第3GB~第4GB的线性地址空间,共1GB大小,内核将其中的前896MB与物理内存的0~896MB进行直接映射,即线性映射,将剩余的128M线性地址空间作为访问高于896M的内存的一个窗口. 引入高端内存映射这样一个概念的主要原因就是我们所安装的内存大于1G时,内核的1G线性地址空间无法建立一个完全的直接映射来触及整个物理内存空间,而对于80x86开启PAE的情况下,允许的最大物理内存可达到64G,因此内核将自己的最后128M的线性地址空间腾出来,用以完成对高端

Linux高端内存映射(上)【转】

转自:http://blog.csdn.net/vanbreaker/article/details/7579941 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 高端内存概述 永久内核映射 高端内存概述 在32位的系统上,内核占有从第3GB~第4GB的线性地址空间,共1GB大小,内核将其中的前896MB与物理内存的0~896MB进行直接映射,即线性映射,将剩余的128M线性地址空间作为访问高于896M的内存的一个窗口.引入高端内存映射这样一个概念的主要原因就是我们所安

Linux高端内存的由来

抱着拿来主义,自己挑选了部分,以下内容摘自网络. Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间.注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的. Linux内核高端内存的由来 当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0xc0000003对应的物理地址为0×3,0xc0000004对应的物理地址为0×4,- -,逻辑地址与物理地址对应的关系为