最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

06 内存(上)划分与组织内存-天天简讯

来源:博客园

分段分页的问题:


(相关资料图)

表示方式和状态确定角度:段的长度和大小不一,页大小固定,只需用位图就能表示页的分配与释放;

内存碎片的利用:段的内存碎片会难以利用,页碎片可以利用修改页表的方式,让连续的虚拟页面映射到非连续的物理页面;

内存和硬盘的数据交换效率:遇到内存不足时系统会将一部分数据写回硬盘,释放内存,段的交换时间不一,页没有这个问题 ;

段最大的问题就是是的虚拟内存地址空间难于实施;因此选择页管理内存;4KB,也正好对应长模式下MMU 4KB的分页方式;

如何表示一个页:

真实的物理页内存布局信息来源于:e820map_t 结构数组,在初始化时已经转换为phymmarge_t结构数组了;

若用位图表示页的话:低效,且信息能表示的少;我们还需要页的状态,页的地址,分配模式,类型,链表等,所以考虑用结构体实现;

msadsc_t 结构体;包括 内存空间地址描述符标志 msadflgs_t结构体, 物理地址和标志 phyadrflgs_t结构体;

内存区:

将多个页面划分为几个内存区,如硬件区、内核区、应用区;方便管理;

硬件区:0~32MB范围, 常见的网卡、AHCI、DMA方式,外部设备直接和内存交换数据,不通过CPU的MMU,且只能访问低于24MB的物理内存,所以就将这部分规定用作硬件区分配页;

内核区:内核也使用内存,运行在虚拟地址空间,需要有一段物理内存和虚拟地址空间是 线性映射关系;内核使用内存需要更大、连续的物理内存空间,就在这个区分配;

应用区:给应用用户态程序使用,系统并不会为应用一次性分配完所需的所有物理内存,而是按需分配,用到一页分配一页;;如果访问到一个没有与物理内存页建立映射关系的虚拟内存页,这时候CPU就会产生缺页异常,最终这个缺页异常由系统处理,系统会分配一个物理内存页,并建好映射关系;这是因为这种情况往往分配的是单个页面,所以为了给单个页面提供快捷的内存请求服务,就需要把离散的单页、或者是内核自身需要建好页表才可以访问的页面,统统收归用户区;;

表示内存区的结构:memarea_t 结构体,包括内存区开始地址和结束地址,里面有多少个物理页面,已经分配多少个物理页面;

接下来要把内存区数据结构 和 内存页面数据 结构关联起来;

组织内存页:

定义一个挂载msadsc_t 结构的数据结构 bafhlst_t 结构体,其中需要锁、状态、msadsc_t结构数量、挂载msadsc_t结构的链表、一些统计数据;

这个数据结构只是有了 挂载msadsc_t结构的地方, 形成了bafhlst_t 结构数组,并且把这个bafhlst_t 结构数组放在一个内存分割合并的数据结构中 memdivmer_t ;

分割:表示分配内存, 合并:释放内存;

其中 dm_mdmlielst 结构代表 bafhlsh_t 结构数组,挂载连续的 msadsc_t 结构数量 等于 这个数组下标值左移之后的值,最大值是51,因为2^51 * 2 ^ 12 = 2 ^ 63,对于64位系统,只需要这样的两个数组就能完整表示所有内存;这样做的意义:

1、内存对齐,提升CPU寻址速度 2、内存分配时,根据需求大小快速定位至少从哪一部分开始 3、内存分配时,并发加锁,分组可以提升效率 4、内存分配回收时,很多计算也更简单

我们并不在意其中第一个 msadsc_t结构数组对应的内存物理地址从哪里开始,但是第一个 msdasc_t 结构 与 最后一个msadsc_t 结构 ,它们之间的内存物理地址之间是连续的;

memarea_t 结构体 包含一个内存分割合并 memdivmer_t 结构,这个结构中又包含 dm_mdmlielst 数组; 数组中挂载了 msadsc_t 结构;

如下图:

关键词: