高端内存和低端内存

参考:http://blog.csdn.net/ghosc/article/details/6625277

  高端内存是 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-10-11 13:09:00

高端内存和低端内存的相关文章

高端内存与低端内存漫谈

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

关于测试行业的高端局和低端局

一 昨天在一个测试群忽然讨论起<软件测试的艺术>这本书当前的价值体现. 不同人站在自己的角度发表了不同的看法,刚好我去年也看了这本书,并且在文章<第二期送书活动>中作了推荐,所以我把自己总结的内容也分享出来了. 但是,这并没有解决大家看法不同的问题,比如有同学提出这毕竟是 40 年前的理论了,目前的技术已经日新月异,那么这些理论是否也应该与时俱进了. 当时我突然觉得王者荣耀里面关于高端局和低端局的说法很适合这里,不管对不对,先说说我的理解,权当抛砖引玉了. 二 先说下背景. 从去年

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

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

Linux内存描述之高端内存--Linux内存管理(五)

1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的线性地址空间. 为了合理的利用逻辑4G空间,Linux采用了3:1的策略,即内核占用1G的线性地址空间,用户占用3G的线性地址空间.所以用户进程的地址范围从0~3G,内核地址范围从3G~4G,也就是说,内核空间只有1G的逻辑线性地址空间. 把内核空间和

内存管理--检测内存

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

A.01.10—模块的输出—PWM高端输出

PWM高端输出比低端输出用得多,如上次提到的卤素灯的控制均是采用高端输出的. PWM高端输出与PWM低端输出的差异就像固态高端输出与固态低端输出的差异类似,从线路失效后对用户的影响来看:高端输出为控制电源,外部线路短路至地后,负载是不会有电的,因为控制端没给电(诊断到短地后切断输出):而对应于某些无法诊断的情况,假使控制端给电,如果外部短路至地,控制模块也是能自保护的,负载无电流通过,仍然不会影响到负载:但对于短路至电源,没有办法,负载一直通电,但短路至电源的概率远低于短路至地.低端输出则由于负

linux高端内存的理解

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

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

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

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