14.linux内核内存区域Zone
来源:互联网 发布:部队网络安全教育教案 编辑:程序博客网 时间:2024/05/19 10:07
通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。
1、x86的物理地址空间布局:
Linux系统在初始化时,会根据实际的物理内存的大小,为每个物理页面创建一个page对象,所有的page对象构成一个mem_map数组。
进一步,针对不同的用途,Linux内核将所有的物理页面划分到3类内存管理区中,如图,分别为ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。
ZONE_DMA的范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用。之所以需要单独管理DMA的物理页面,是因为DMA使用物理地址访问内存,不经过MMU,并且需要连续的缓冲区,所以为了能够提供物理上连续的缓冲区,必须从物理地址空间专门划分一段区域用于DMA。
ZONE_NORMAL的范围是16M~896M,该区域的物理页面是内核能够直接使用的。
ZONE_HIGHMEM的范围是896M~结束,该区域即为高端内存,内核不能直接使用。
linux虚拟地址与物理地址映射的关系
Linux将4G的线性地址空间分为2部分,0~3G为user space,3G~4G为kernel space。
由于开启了分页机制,内核想要访问物理地址空间的话,必须先建立映射关系,然后通过虚拟地址来访问。为了能够访问所有的物理地址空间,就要将全部物理地址空间映射到1G的内核线性空间中,这显然不可能。于是,内核将0~896M的物理地址空间一对一映射到自己的线性地址空间中,这样它便可以随时访问ZONE_DMA和ZONE_NORMAL里的物理页面;此时内核剩下的128M线性地址空间不足以完全映射所有的ZONE_HIGHMEM,Linux采取了动态映射的方法,即按需的将ZONE_HIGHMEM里的物理页面映射到kernel space的最后128M线性地址空间里,使用完之后释放映射关系,以供其它物理页面映射。虽然这样存在效率的问题,但是内核毕竟可以正常的访问所有的物理地址空间了。
Linux内核高端内存的理解
前 面我们解释了高端内存的由来。 Linux将内核地址空间划分为三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高端内存HIGH_MEM地址空间范围为 0xF8000000 ~ 0xFFFFFFFF(896MB~1024MB)。那么如内核是如何借助128MB高端内存地址空间是如何实现访问可以所有物理内存?
当内核想访问高于896MB物理地址内存时,从0xF8000000 ~ 0xFFFFFFFF地址空间范围内找一段相应大小空闲的逻辑地址空间,借用一会。借用这段逻辑地址空间,建立映射到想访问的那段物理内存(即填充内核PTE页面表),临时用一会,用完后归还。这样别人也可以借用这段地址空间访问其他物理内存,实现了使用有限的地址空间,访问所有所有物理内存。如下图。
例 如内核想访问2G开始的一段大小为1MB的物理内存,即物理地址范围为0×80000000 ~ 0x800FFFFF。访问之前先找到一段1MB大小的空闲地址空间,假设找到的空闲地址空间为0xF8700000 ~ 0xF87FFFFF,用这1MB的逻辑地址空间映射到物理地址空间0×80000000 ~ 0x800FFFFF的内存。映射关系如下:
当内核访问完0×80000000 ~ 0x800FFFFF物理内存后,就将0xF8700000 ~ 0xF87FFFFF内核线性空间释放。这样其他进程或代码也可以使用0xF8700000 ~ 0xF87FFFFF这段地址访问其他物理内存。
从上面的描述,我们可以知道高端内存的最基本思想:借一段地址空间,建立临时地址映射,用完后释放,达到这段地址空间可以循环使用,访问所有物理内存。
buddyinfo的理解cat /proc/buddyinfo 显示如下:
Node 0, zone DMA 0 4 5 4 4 3 ...
Node 0, zone Normal 1 0 0 1 101 8 ...
Node 0, zone HighMem 2 0 0 1 1 0 ...
其中,Node表示在NUMA环境下的节点号,这里只有一个节点0;zone表示每一个节点下的区域,一般有DMA、Normal和HignMem三个区域;后面的列表示,伙伴系统中每一个order对应的空闲页面块。例如,对于zone DMA的第二列(从0开始算起),空闲页面数为5*2^4,可用内存为5*2^4*PAGE_SIZE。
计算方法就是:
当前列的数字*2^列数*PAGE_SIZE 其中列数是从0开始计算的,即第一列是 当前列的数字*2^0*PAGE_SIZE
- 14.linux内核内存区域Zone
- Linux memory management,内核高端内存及各Zone介绍
- Linux内存描述之内存区域zone--Linux内存管理(三)
- linux内存管理之zone
- 再读uclinux-2008r1(bf561)内核存储区域管理(3):zone初始化
- 读深入理解Linux内核 (第9章 进程地址空间, 第二部分 ---- 内存区域)
- Linux内核内存分配
- Linux内核内存操作
- linux内核内存管理
- LINUX内核内存屏障
- LINUX内核内存屏障
- linux内核-内存地址
- Linux内核高端内存
- LINUX内核内存屏障
- Linux内核高端内存
- linux内核内存管理
- Linux内核--内存管理
- Linux内核高端内存
- C语言面向对象编程(二):继承详解
- 临近小区分析-利用ArcGIS构建分析模型
- 防盗链referer origin
- 关于Spring MVC 跨域访问
- Acivity加载webview显示页面不正确显示最底部把头部顶上去
- 14.linux内核内存区域Zone
- mysql 知识
- OpenCV的Mat和Halcon的HObject类型互相转换
- android Studio实现极光推送
- ConfigReader(五十一)—— ReadSkillEmitConfig
- 使用消息队列的10个理由
- 福布斯富豪榜出炉 盖茨24年问鼎榜首
- C语言面向对象编程(三):虚函数与多态
- 从Excel表定义导入导出到PowerDesigner