内存管理概述

概述

内存管理子系统的架构如下图所示,主要分为用户空间、内核空间和硬件

应用空间

1.应用程序通过malloc、free来分配和释放内存,它们是glibc库的内存分配器ptmalloc提供的接口;

2.ptmalloc使用系统调用brk或mmap向内核以页为单位申请内存,然后划分成小内存块分配给应用程序

内核空间

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

2。内核使用延迟分配物理内存的策略,进程第一次访问虚拟页的时候,触发页错误异常,页错误异常处理程序从页分配器申请物理页,在进程的页表中把虚拟页映射到物理页。

3.页分配器负责分配物理页,当前使用的页分配器是伙伴分配器。

4.内核空间提供了把页划分成小内存块分配的块分配器,提供分配内存的接口 kmalloc()和释放内存的接口 kfree(), 支持 种块分配器: SLAB 分配器、 SLUB 分配器和 SLOB分配器

5.在内核初始化的过程中,页分配器还没准备好,需要使用临时的引导内存分配器分配内存。

6.在内存碎片化的时候,申请连续物理页的成功率很低,不连续页分配器提供了分配内存的接口 vmalloc 和释放内存的接口 vfree,可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续而物理地址不连续。

7.每处理器内存分配器用来为每处理器变批分配内存

8.连续内存分配器 (Contiguous Memory Allocator, CMA) 用来给驱动程序预留一段连续的内存,当驱动程序不用的时候,可以给进程使用;当驱动程序需要使用的时候,把进程占用的内存通过回收或迁移的方式让出来,给驱动程序使用。

9.内存控制组用来控制进程占用的内存资源

10.当内存碎片化的时候,找不到连续的物理页,内存紧缩通过迁移的方式得到连续的物理页

11在内存不足的时候,页回收负责回收物理页,对于没有后备存储设备支持的匿名页,把数据换出到交换区,然后释放物理页;对于有后备存储设备支待的文件页,把数据写回存储设备,然后释放物理页。

12.如果页回收失败,使用最后一招 内存耗尽杀手 (OOM killer, Out-of-Memory killer), 来选择进程杀掉,或者panic

硬件层

1.处理器包含一个称为内存管理单元MMU的部件,负责把虚拟地址转换成物理地址

2.内存管理单元包含一个称为页表缓存 (Translation Lookaside Buffer, TLB) 的部件,保存最近使用过的页表映射,避免每次把虚拟地址转换成物理地址都需要查询内存中的页表。

3.为了解决处理器的执行速度和内存的访问速度不匹配的问题,在处理器和内存之间增加了缓存。缓存通常分为一级缓存和二级缓存,为了支持并行地取指令和取数据, 二级缓存分为数据缓存和指令缓存。

虚拟地址空间布局

基本概念如下:

1.虚拟地址的最大宽度一般是是48位,内核虚拟地址在64位地址空间的顶部,高 16 位是全 1, 范围是[OxFFFF 0000 0000 0000, OxFFFF FFFF FFFF FFFF];用户虚拟地址在64位地址空间的底部,高16位是全0, 范围是[0x0000 0000 0000 0000, 0x0000 FFFF FFFF FFFF]

2.如果处理器实现了ARMv8.2标准的大虚拟地址 (Large Virtual Address, LVA) 支持,并且页长度是 64KB, 那么虚拟地址的最大宽度是52位

3.可以为内核虚拟地址和用户虚拟地址配置不同的宽度,编译内核时选择不同的页长度,默认虚拟地址宽度也是不一样,比如4KB页长度,默认是39位虚拟地址宽度

用户虚拟地址空间布局

进程的用户虚拟地址包含如下区域

起始地址是 0, 长度是 TASK_SIZE;对于ARM64架构,32位用户程序的值为4GB,32位用户程序的值为2的VA_BITS,其布局如下

内核虚拟地址空间布局

线性映射区域起始位置是PAGE_OFFSET;长度是内核虚拟地址空间的一半,其布局如下

内核线性映射

关于这段内核虚拟地址空间,内核给提前映射到对应的物理内存上了,也就是有页表了,不用每次更新,提高了效率。我内核空间反正就一个页表,干嘛不拿出一部分直接映射来提升效率呢?

用户虚拟地址空间,当然也可以映射到  “内核给提前映射到对应的物理内存” 的这段内存上了,毕竟大家页表都不一样,我用户空间的每个进程的页表都是独立的,大家当然都可以来产生映射关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值