linux内存管理器子系统
2016-05-25 21:15
369 查看
今天学习了一下linux的内存管理子系统。这里总结一下。
linux系统的结构图如下所示:
它有好几个部分组成:硬件架构部分(ARCH)、设备驱动、内存管理、网络栈、进程管理、VFS、系统调用接口。今天简单介绍一下内存管理子系统——memory managementa。
内存管理子系统主要有这几个工作:
(1)虚拟地址空间分布
(1)负责虚拟地址与物理地址的映射
(2)物理地址的分配管理
先简单介绍虚拟地址空间分布,如下图所示:
右边红框是linux的虚拟地址空间分布。一些芯片的数据手册中介绍的某些寄存器的地址是物理地址,用汇编语言直接操作寄存器的时候会用到物理地址。在linux系统中,或者在软件编程中,使用的往往是虚拟地址。虚拟地址空间范围有CPU决定,地址总线为32位的CPU,它的虚拟地址空间容量有2^32=4GB的空间。
如上图,linux虚拟地址空间分为用户空间和内核空间两大部分。0~3G是用户空间,3G~4G是内核空间。(以S5PV210为例)
内核空间又分为四个区域:直接映射区、vmalloc区、永久内核映射区、固定映射线性去。这四个区域在虚拟地址到物理地址的映射上有一定区别。
1、用户空间到物理地址的映射。原来如下图
cr3寄存器中存放有页目录基地址,与虚拟地址的高10位页目录偏移量相加,可以找到页目录里面的一个页目录项。页目录项存放着一个页表的基地址,该基地址与虚拟地址的中间第12—21位的页表偏移量相加,即可找到一个物理页的基地址。物理页的基地址,加上虚拟地址的低12位的物理页偏移量,即可得到实际屋物理页中的物理存储单元。一个物理页大小4kb
2、内核空间虚拟地址到物理地址的映射
(1)直接映射区:
该区域范围是:3G——>3G+896MB。该区域的虚拟地址=3G+物理地址。因此,虚拟地址减去3G即可得到物理地址。物理地址中,896MB以后的区域成为高端区,896MB以内区域(0~896)称为低端区域。直接映射区对应的物理地址是低端区。所以叫它直接映射区。
(2)vmalloc区:该区域虚拟地址即可访问高端区域,也可访问低端区域。与物理地址之间没有简单映射关系。
(3)永久映射区:固定用来访问物理地址为896MB~1G的高端内存的。
(4)固定映射线性区:此区域的虚拟地址用来访问一些固定的寄存器。
除了直接映射区外,其他区域都要通过相应页目录跟页表来映射到物理地址。
最后介绍一下物理内存的分配管理。如下图
用malloc、fork、excute、mmap申请内存空间时,返回的虚拟地址并没有与物理地址相对应,即实际上没有分配物理地址,仅当访问虚拟地址时,才会分配物理内存。
但是用Kmalloc申请内存空间时,返回的虚拟地址已经跟物理地址相对应,即已经分配了物理地址。
以上讲的所有操作都是有内存管理子系统完成的。欢迎拍砖。
linux系统的结构图如下所示:
它有好几个部分组成:硬件架构部分(ARCH)、设备驱动、内存管理、网络栈、进程管理、VFS、系统调用接口。今天简单介绍一下内存管理子系统——memory managementa。
内存管理子系统主要有这几个工作:
(1)虚拟地址空间分布
(1)负责虚拟地址与物理地址的映射
(2)物理地址的分配管理
先简单介绍虚拟地址空间分布,如下图所示:
右边红框是linux的虚拟地址空间分布。一些芯片的数据手册中介绍的某些寄存器的地址是物理地址,用汇编语言直接操作寄存器的时候会用到物理地址。在linux系统中,或者在软件编程中,使用的往往是虚拟地址。虚拟地址空间范围有CPU决定,地址总线为32位的CPU,它的虚拟地址空间容量有2^32=4GB的空间。
如上图,linux虚拟地址空间分为用户空间和内核空间两大部分。0~3G是用户空间,3G~4G是内核空间。(以S5PV210为例)
内核空间又分为四个区域:直接映射区、vmalloc区、永久内核映射区、固定映射线性去。这四个区域在虚拟地址到物理地址的映射上有一定区别。
1、用户空间到物理地址的映射。原来如下图
cr3寄存器中存放有页目录基地址,与虚拟地址的高10位页目录偏移量相加,可以找到页目录里面的一个页目录项。页目录项存放着一个页表的基地址,该基地址与虚拟地址的中间第12—21位的页表偏移量相加,即可找到一个物理页的基地址。物理页的基地址,加上虚拟地址的低12位的物理页偏移量,即可得到实际屋物理页中的物理存储单元。一个物理页大小4kb
2、内核空间虚拟地址到物理地址的映射
(1)直接映射区:
该区域范围是:3G——>3G+896MB。该区域的虚拟地址=3G+物理地址。因此,虚拟地址减去3G即可得到物理地址。物理地址中,896MB以后的区域成为高端区,896MB以内区域(0~896)称为低端区域。直接映射区对应的物理地址是低端区。所以叫它直接映射区。
(2)vmalloc区:该区域虚拟地址即可访问高端区域,也可访问低端区域。与物理地址之间没有简单映射关系。
(3)永久映射区:固定用来访问物理地址为896MB~1G的高端内存的。
(4)固定映射线性区:此区域的虚拟地址用来访问一些固定的寄存器。
除了直接映射区外,其他区域都要通过相应页目录跟页表来映射到物理地址。
最后介绍一下物理内存的分配管理。如下图
用malloc、fork、excute、mmap申请内存空间时,返回的虚拟地址并没有与物理地址相对应,即实际上没有分配物理地址,仅当访问虚拟地址时,才会分配物理内存。
但是用Kmalloc申请内存空间时,返回的虚拟地址已经跟物理地址相对应,即已经分配了物理地址。
以上讲的所有操作都是有内存管理子系统完成的。欢迎拍砖。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍