虚拟地址空间布局架构

内存管理架构

Linux内核整体架构及子系统

Linux内核只是操作系统中的一部分,对下管理系统所有硬件设备;对上通过系统调用向Library Routine或(或者其它应用程序提供API接口)

linux内核架构

Linux内存管理架构

用户空间

相当于应用程序使用malloc()申请内存,通过free()释放内存。malloc()/free()是glibc库的内存分配器ptmalloc提供的接口,ptmalloc使用系统调用brk或mmap向内核以页为单位申请内存,然后进行分成很小内存块分配给对应应用程序。

内核空间

虚拟内存管理负责从进程的虚拟地址空间分配虚拟页,sys_brk来扩大或收缩堆,sys_mmap用来在内存映射区域分配虚拟页,sys_munmap用来释放虚拟页。页分配器负责分配物理页,使用分配器是伙伴分配器。

内核空间拓展功能,不连续页分配器提供分配内存的接口vmalloc和释放内存接口vfree。在内存碎片化的时候,申请连续物理内存的成功率比较低,可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续而物理地址不连续。

内存控制组用来控制进程占用的内存资源。当内存碎片化的时候,找不到连续的物理页,内存碎片整理通过迁移方式得到连续的物理页。在内存不足的时候,页回收负责回收物理页。

硬件

MMU包含一个页表缓存,保存最近使用过的页表映射,避免每次把虚拟地址转换为物理地址都需要查询内存当中的页表。解决处理器执行速度和内存速度不匹配问题,中间增加一个缓存。一级缓存分为数据缓存和指令缓存。二级作用协调一级缓存和内存之间的工作效率。

系统调用(system call)

c++语言中,new/delete它们底层的实现也是malloc/free实现的。我们在编程的时候使用malloc()/free()与内核之间的接口(桥梁)就是sbrk()等系统函数。

内存管理详细流程

Snipaste_2023-10-31_18-37-40

虚拟地址空间布局架构

用户虚拟地址空间划分

​ VS_BITS是编译内核时选择的虚拟地址位数(这里源码是linux4.12.13的)

Snipaste_2023-11-02_17-23-02

进程的用户虚拟地址空间包含区域:

代码段、数据段、未初始化数据段;

动态库的代码段、数据段、未初始化数据段;

存放动态生成的数据的堆;

存放局部变量和实现函数调用的栈;

把文件区间映射到虚拟地址空间的内存映射区域;

存放在栈底部的环境变量和参数字符串。

1、内核使用内存描述符mm_struct描述进程的用户虚拟地址空间,内核源码如下:

mm_struct1

mm_struct2

mm_struct3

一个进程的虚拟地址空间主要由两个数据结构进行描述。一个是最高层次的mm_struct,较高层次的vm_area_struct。最高层次mm_struct描述一个进程整个虚拟地址空间。较高层次结构描述虚拟地址空间的一个区间(称为虚拟区)。每个进程只有一个mm_struct结构,在每个进程的task_struct结构中,有一个专门用来指向该进程的结构。mm_struct结构是对整个用户空间的描述。

mm_struct-vm_area_struct

1

2

vm_area_struct

task_struct指向mm_struct

内核地址空间布局

ARM64处理器架构内核地址空间布局如图所式:

ARM64

KASAN:动态内存错误检查工具。

THE END