linux high memory/ low memory
2014-10-01 02:13
435 查看
linux内核的high memory概念详解 - 铁匠Smith先生的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/acs713/article/details/8575235
32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。linux一般把这个4G的地址空间划分为两个部分:其中0~3G为用户程序地址空间,虚地址0x00000000到0xBFFFFFFF,供各个进程使用;3G~4G为内核的地址空间,虚拟地址0xC0000000到0xFFFFFFFF, 供内核使用。(注意,ARM架构不是3G/1G划分的,而是2G/2G划分。这里以3G/1G划分作讲解)。如下图所示:
可以看出,每个进程都有自己的私有用户空间(0-3GB),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则由则由所有进程以及内核共享。可见,内核最多寻址1G的虚拟地址空间。
Linux 内核采用了最简单的映射方式来映射物理内存,即把物理地址+PAGE_OFFSET按照线性关系直接映射到内核空间。PAGE_OFFSET大小为0xC000000.但是linux内核并没有把整个1G空间用于线性映射,而只映射了最多896M物理内存,预留了最高端的128M虚拟地址空间给IO设备和其他用途。
所以,当系统物理内存较大时,超过896M的内存区域,内核就无法直接通过线性映射直接访问了。这部分内存被称作high memory。相应的可以映射的低端物理内存称为Low memory.
而对于2G/2G划分的arm机器,这个线性映射空间就可能达到1G以上,能够直接映射到这个线性空间的物理地址是DMA zone和Normal Zone,在这个范围之外的物理内存则划归High memory Zone。
结论:
1)high memory针对的是物理内存,不是虚拟内存。
2)high memory也是被内核管理的(有对应的page结构),只是没有映射到内核虚拟地址空间。当内核需要分配high memory时,通过kmap等从预留的地址空间中动态分配一个地址,然后映射到high memory,从而访问这个物理页。high memory映射到内核地址空间一般是暂时性的映射,不是永久映射。
3)high memory和low memory一样,都是参与内核的物理内存分配,都可以被映射到内核地址空间,也都可以被映射到用户地址空间。
4)物理内存<896M时,没有high memory,因为所有的内存都被kernel直接映射了。
5)64位系统下不会有high memory,因为64位虚拟地址空间非常大(分给kernel的也很大),完全能够直接映射全部物理内存。
参考文献:http://blog.sina.com.cn/s/blog_6488248f0100wu6v.html
http://blog.csdn.net/acs713/article/details/8575235
32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。linux一般把这个4G的地址空间划分为两个部分:其中0~3G为用户程序地址空间,虚地址0x00000000到0xBFFFFFFF,供各个进程使用;3G~4G为内核的地址空间,虚拟地址0xC0000000到0xFFFFFFFF, 供内核使用。(注意,ARM架构不是3G/1G划分的,而是2G/2G划分。这里以3G/1G划分作讲解)。如下图所示:
可以看出,每个进程都有自己的私有用户空间(0-3GB),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则由则由所有进程以及内核共享。可见,内核最多寻址1G的虚拟地址空间。
Linux 内核采用了最简单的映射方式来映射物理内存,即把物理地址+PAGE_OFFSET按照线性关系直接映射到内核空间。PAGE_OFFSET大小为0xC000000.但是linux内核并没有把整个1G空间用于线性映射,而只映射了最多896M物理内存,预留了最高端的128M虚拟地址空间给IO设备和其他用途。
所以,当系统物理内存较大时,超过896M的内存区域,内核就无法直接通过线性映射直接访问了。这部分内存被称作high memory。相应的可以映射的低端物理内存称为Low memory.
而对于2G/2G划分的arm机器,这个线性映射空间就可能达到1G以上,能够直接映射到这个线性空间的物理地址是DMA zone和Normal Zone,在这个范围之外的物理内存则划归High memory Zone。
结论:
1)high memory针对的是物理内存,不是虚拟内存。
2)high memory也是被内核管理的(有对应的page结构),只是没有映射到内核虚拟地址空间。当内核需要分配high memory时,通过kmap等从预留的地址空间中动态分配一个地址,然后映射到high memory,从而访问这个物理页。high memory映射到内核地址空间一般是暂时性的映射,不是永久映射。
3)high memory和low memory一样,都是参与内核的物理内存分配,都可以被映射到内核地址空间,也都可以被映射到用户地址空间。
4)物理内存<896M时,没有high memory,因为所有的内存都被kernel直接映射了。
5)64位系统下不会有high memory,因为64位虚拟地址空间非常大(分给kernel的也很大),完全能够直接映射全部物理内存。
参考文献:http://blog.sina.com.cn/s/blog_6488248f0100wu6v.html
相关文章推荐
- Optimizing Linux Memory Management for Low-latency / High-throughput Databases
- Linux kernel High memory
- Feature: High Memory In The Linux Kernel
- Feature: High Memory In The Linux Kernel
- High Memory In The Linux Kernel(Cited)
- Linux High Memory
- High Memory in the Linux Kernel
- Android对Linux内核的增强:Low Memory Killer(低内存管理)
- linux high memory 映射-1
- Linux High Memory 笔记
- Linux high memory 学习总结
- Linux Memory Mapping
- 硬盘安装Linux:less than 4MB memory
- Software by Numbers: Low-Risk, High-Return Development
- 主要Linux 平台高可用集群软件(High Availability Cluster- HA)简介
- Linux kernel Low Level debug
- Beginning Linux Programming----Low-level File Access (2)
- User-Level Memory Management in Linux Programming转
- System 提供的编译期函数(Dec,Inc,Odd,Pred,Succ,Ord,Chr,Low,High,Sizeof)
- Dunk Womens Shoes,Dunk Low SB Shoes,Dunk High SB Shoes