内存管理--虚拟地址空间布局架构

1 介绍

内存管理是内核中非常重要的一个子系统,它主要分为三个层面用户空间,内核空间,硬件
1 用户空间: 主要是针对malloc/free,new/delete
2 内核空间: 内核中的sbrk/brk等系统调用
3 硬件:处理器包含一个内存管理单元MMU的部件
在这里插入图片描述

2 内存管理布局架构

1 内存管理架构
现代操作系统标准组成:cpu,memory(内存和外存),输入输出(IO),网络设备和外围设备,具体如下:
在这里插入图片描述
内存管理布局架构图:
在这里插入图片描述
1 应用空间:相当于使用malloc/free,c++中使用new/delete;注意的是malloc、free是glibc库的内存分配器ptmalloc提供的接口,底层会调用brk或mmap向内核以页为单位申请内存,然后进行分成很多小内存块分配给对应应用程序。
2 内核空间:虚拟内存管理负责从进程的虚拟地址空间分配虚拟页,sys_brk来扩大或者收缩堆,sys_mmap用来在内存映射区分配虚拟页,sys_munmap用来释放虚拟页。页分配器负责分配物理页,使用分配器是伙伴分配器。
虚拟空间扩展功能,不连续页分配器提供分配内存的接口vmalloc和释放内存接口vfree。在内存碎片化的时候使用率比较低,可以申请不联系物理页,映射到联系的虚拟页,即虚拟地址联系而物理地址不连续。
内存控制组用来控制进程占用的内存资源。当内存碎片化的时候,找不到连续的物理页,内存碎片整理通过迁移的方式得到连续的物理页。在内存不足的时候,页回收复制收回物理页。
3 硬件
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,即2VA_BITS字节。
VA_BITS是编译内核的时候选择的虚拟地址位数。
虚拟地址空间包含的区域:
代码段,数据段,未初始化数据段;
动态库的代码段,数据段和未初始化数据段;
存放动态生成的数据的堆;
存放局部变量和实现函数调用的栈;
把文件区间映射到虚拟地址空间的内存映射区域;
存放在栈底部的环境变量和参数字符串。

2 内核内存描述符
每个进程结构体task_struct中有两个成员变量

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

对于结构体mm

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丰恒谷

你的鼓励是我最大创作动力!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值