Minix内存管理
1概述
Minix 在设计时被分成了四层,如下图所示,第1层和第2层是进程管理和I/O任务,合称为Minix的核心(kernel), 内存管理(Memory Manager,下文简称MM) 并不是内核的一部分,它位于内核之上的第三层,主要处理的是FORK,EXEC,BRK等涉及到内存访问的系统调用。它和内核之间通过消息来通信。
本文首先介绍内存管理最基本的部分:物理内存的分配和回收,然后介绍和内存分配相关的系统调用,例如FORK、EXEC、BRK、信号处理等,其中会涉及到进程管理和文件系统。通过本文的介绍,大家会对Minix的内存管理有大致的了解,并且能够清楚的看到一段可执行代码如何被装入内存,分配资源后执行的。
注:下文中程序的行号和《操作系统:设计与实现》一书中附录A保持一致
2物理内存的分配和回收
内存管理的策略有很多,比如交换、分页、分段、段页式等,Minix的内存管理非常简单:既不分页也不交换。存储管理器保存着一张按照内存地址排列的空洞列表。当由于执行系统调用FORK或EXEC需要内存时,系统特用首次适配算法对空洞列表进行按索找出一个足够大的空洞。一旦一个程序被装入内存,它将一直保持在原来的位置直到运行结束,它永远不会被换出或移动到内存的其他位置去,为它分配的空间也不会增长或缩小。
物理内存管理主要包括下面几种功能:
1. 内存初始化:当MM启动时需要初始化内存空洞表
2. 分配指定大小的内存
3. 释放一块以前分配的内存
4. 返回当前最大空洞的大小
空洞列表的数据结构如下:
18820 #define NR_HOLES 128 /* max # entries in hole table */
18821 #define NIL_HOLE (struct hole *) 0
18822
18823 PRIVATE struct hole {
18824 phys_clicks h_base; /* 空洞的开始地址*/
18825 phys_clicks h_len; /* 空洞的长度 */
18826 struct hole *h_next; /* 指向下一个空洞 */
18827 } hole[NR_HOLES];
18830 PRIVATE struct hole *hole_head; /* pointer to first hole */
18831 PRIVATE struct hole *free_slots; /* ptr to list of unused table slots */
上面的数据结构说明,空洞表中共有128个表项,各个表项之间通过指针连接成一个链表。
指针hole_head指向第一个空洞,free_slots的含义在下文会说明
由于MM采用了非常简单的策略,所以其数据结构也非常简单,操作无非是链表的遍历,增加,删除等,