问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

内存管理:虚拟地址空间布局架构详解

创作时间:
作者:
@小白创作中心

内存管理:虚拟地址空间布局架构详解

引用
CSDN
1.
https://m.blog.csdn.net/u011744843/article/details/124370742

内存管理是操作系统中最核心的子系统之一,它负责有效地分配和回收内存资源,确保各个进程能够正确地访问和使用内存。本文将深入探讨内存管理的虚拟地址空间布局架构,包括用户空间、内核空间和硬件层面的内存管理机制,以及虚拟地址空间的具体布局方式。

1 介绍

内存管理是内核中非常重要的一个子系统,它主要分为三个层面:用户空间、内核空间和硬件。

  1. 用户空间:主要是针对malloc/freenew/delete等内存分配和释放操作。
  2. 内核空间:内核中的sbrk/brk等系统调用。
  3. 硬件:处理器包含一个内存管理单元(MMU)的部件。

2 内存管理布局架构

  1. 内存管理架构

现代操作系统标准组成:CPU、Memory(内存和外存)、输入输出(IO)、网络设备和外围设备,具体如下:

内存管理布局架构图:

  1. 应用空间:相当于使用malloc/free,C++中使用new/delete;注意的是mallocfree是glibc库的内存分配器ptmalloc提供的接口,底层会调用brkmmap向内核以页为单位申请内存,然后进行分成很多小内存块分配给对应应用程序。

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

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

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

  1. 硬件

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

3 虚拟地址空间布局架构

目前应用程序没有那么大的内存需求,所以在ARM64处理器不支持完全64位虚拟地址空间。

在ARM64架构的Linux内核中,内核虚拟地址和用户虚拟地址的宽度相同。

所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间,同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。

  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是编译内核时选择的虚拟地址位数。

虚拟地址空间包含的区域:

  • 代码段
  • 数据段
  • 未初始化数据段
  • 动态库的代码段、数据段和未初始化数据段
  • 存放动态生成的数据的堆
  • 存放局部变量和实现函数调用的栈
  • 把文件区间映射到虚拟地址空间的内存映射区域
  • 存放在栈底部的环境变量和参数字符串
  1. 内核内存描述符

每个进程结构体task_struct中有两个成员变量:

struct task_struct {
    .....
    struct mm_struct *mm;
    struct mm_struct *active_mm;
    .....
};

对于结构体mm

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号