内存管理专题01 虚拟地址空间布局架构

一、内存管理架构
二、虚拟地址空间布局

一、内存管理架构
内存管理子系统架构分为:用户空间、内核空间及硬件部分三个层面,具体结构:
1、用户空间:应用程序使用malloc()申请内存资源,free()释放内存资源
2、内核空间:内核总是停留在内存中,是操作系统的一部分。内核空间为内存保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数
3、硬件:处理器包含一个内存管理单元(Memory Management Unit,MMU)的部件,负责把虚拟地址转换成物理地址

Linux内核整体架构及子系统
linux内核只是操作系统当中的一部分,对下管理系统所有硬件设备;对上通过系统调用向library routine(或其他应用程序提供API接口)

内存管理专题01 虚拟地址空间布局架构_第1张图片
内核重心在于:管理硬件设备、供应用程序使用。
现代系统标准组成:CPU、Memory(内存和外存)、I/O设备、网络设备和其他外围设备。

linux内核架构如下:
内存管理专题01 虚拟地址空间布局架构_第2张图片
内存管理架构:
**用户空间:**上面是应用程序,通过专门的函数如(malloc/free/new/delete)提供的库来进行实现操作对应的内存地址。
相当于应用程序使用malloc()申请内存,通过free()释放内存。malloc()/free()是glibc库的内存分配器ptmalloc提供的接口,ptmalloc
内存管理专题01 虚拟地址空间布局架构_第3张图片

内核空间:通过sys_brk/sys_mmp/sys_munmap处理,比如虚拟内存管理,页表管理,内存控制,内存碎片管理,页回收,内存耗尽,分配器,引导内存分配器等,都是内核里面的模块。
相当于虚拟内存管理负责从进程的虚拟地址空间分配虚拟页,sys_brk来扩大或者收缩堆,sys_mmap用来在内存映射区域分配虚拟页,sys_munmap来释放虚拟页。页分配器来负责分配物理页,使用的是伙伴分配器。
内核空间扩展功能,不连续页分配器提供分配内存的接口vmalloc和释放内存接口vfree。在内存碎片化的时候,申请连续页的成功率比较低,可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续但物理地址不连续。
内存控制组用来控制进程占用的内存资源。当内存碎片化的时候找不到连续的物理页,内存碎片整理通过迁移方式得到连续的物理页。在内存不足的时候,页回收负责回收物理页。
内存管理专题01 虚拟地址空间布局架构_第4张图片
**硬件:**硬件所对应的部分如中央处理器(内存管理单元(页表缓存),缓存),物理内存。
MMU(内存管理单元)包含一个页表缓存,保存最近使用过的页表映射,避免每次把虚拟地址转化成物理地址都需要查询内存中的页表。解决处理器执行速度和内存速度不匹配的问题,中间增加一个缓存。一级缓存分为数据缓存和指令缓存。二级作用协调一级缓存和内存之间的工作效率。
内存管理专题01 虚拟地址空间布局架构_第5张图片
从代码的角度:
系统调用(System Call)
内存管理专题01 虚拟地址空间布局架构_第6张图片

二、虚拟地址空间布局架构
因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址。
在ARM64架构的linux内核中,内核虚拟地址和用户虚拟地址的宽度相同。
所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间,同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。
内存管理专题01 虚拟地址空间布局架构_第7张图片
1 用户虚拟地址空间划分
进程的用户虚拟空间的起始地址是0,长度是TASK_SIZE,由每种处理器架构定义自己的宏TASK_SIZE。ARM64架构定义的宏TASK_SIZE如下:
32位用户空间程序:TASK_SIZE的值是TASK_SIZE_32,及0x100000000,等4GB。
64位用户空间程序:TASK_SIZE的值是TASK_SIZE_64,即2^VA_BITS字节。
VA_BITS是编译内核时候选择的虚拟地址位数
内存管理专题01 虚拟地址空间布局架构_第8张图片
进程的用户虚拟地址空间包含区域:
代码段,数据段,未初始化数据段;
动态库的代码段,数据段和未初始化数据段;
存放动态生成的数据堆;
存放局部变量和实现函数调用的栈;
把文件区间映射到虚拟地址空间的内存映射区域;
存放在栈底部的环境变量和参数字符串。

用户虚拟地址空间linux内核源码分析如图:
内存管理专题01 虚拟地址空间布局架构_第9张图片
内存管理专题01 虚拟地址空间布局架构_第10张图片
在这里插入图片描述
linux内核使用内存描述符mm_struct,描述进程的用户虚拟地址空间,内核源码分析:
内存管理专题01 虚拟地址空间布局架构_第11张图片
内存管理专题01 虚拟地址空间布局架构_第12张图片
内存管理专题01 虚拟地址空间布局架构_第13张图片
内存管理专题01 虚拟地址空间布局架构_第14张图片
内存管理专题01 虚拟地址空间布局架构_第15张图片
一个进程的虚拟地址空间主要由两个数据结构描述。一个是最高层次的mm_struct,较高层次的vm_area_struct。最高层次的mm_struct结构描述一个进程整个虚拟地址空间。较高层次结构描述虚拟地址空间的一个区间(成为虚拟区)。每个进程只有一个mm_struct结构,在每个进程的mm_struct结构中,有一个专门用来指向该进程的结构。mm_struct结构是对整个用户空间的描述。
内存管理专题01 虚拟地址空间布局架构_第16张图片
内存管理专题01 虚拟地址空间布局架构_第17张图片
内存管理专题01 虚拟地址空间布局架构_第18张图片
内存管理专题01 虚拟地址空间布局架构_第19张图片
内存管理专题01 虚拟地址空间布局架构_第20张图片
2 内核地址空间划分
ARM64处理器架构内核地址空间布局如图:
(KASAN:动态内存错误检查工具)
内存管理专题01 虚拟地址空间布局架构_第21张图片

你可能感兴趣的:(linux,arm,android)