目录
一、实验目的
1、熟悉Minix操作系统的进程管理
2、学习Unix风格的内存管理
二、内容与设计思想
修改Minix3.1.2a的进程管理器,改进brk系统调用的实现,使得分配给进程的数据段+栈段空间耗尽时,brk系统调用给该进程分配一个更大的内存空间,并将原来空间中的数据 复制至新分配的内存空间,释放原来的内存空间,并通知内核映射新分配的内存段。
三、使用环境
物理机:Windows10
虚拟机:Minix3.1.2
虚拟机软件:Vmware
终端控制软件:MobaXterm
物理机与虚拟机文件传输:FileZilla
四、实验过程
(1)Minix3.1.2实验环境配置
· 下载Minix3.1.2镜像文件并创建虚拟机
· 修改虚拟机兼容性,选择5.x版本
· 启动虚拟机,在setup步骤中,网卡选择AMD LANCE以便获得IP地址。安装完成后,输入shutdown,然后输入boot d0p0重启。
· 输入mv /etc/rc.daemons.dist /etc/rc.daemons。在网络模式设置为NAT模式时,重启后可以看到IP地址。
· 在虚拟机终端输入packman安装额外的软件包,为了方便,选择全部安装(400MB左右)
(2)实现alloc.c函数
· 修改/usr/src/servers/pm/alloc.c中的alloc_mem函数,把first-fit修改成best-fit,即在分配内存之前,先遍历整个空闲内存块列表,找到最佳匹配的空闲块。
· 函数实现思路:
遍历空闲块的链表,best_ptr记录当前最佳适配的空闲块,若找到满足条件且更小的空闲块,那么则对best_ptr进行更新,直至遍历结束。
hp=hole_head;
best_ptr=NIL_HOLE;//记录当前找到的最佳适配块
best_prev_ptr=NIL_HOLE;
prev_ptr=NIL_HOLE;
while(hp!=NIL_HOLE && hp->h_base < swap_base){
if(hp->h_len >= clicks && best_ptr== NIL_HOLE){
best_ptr=hp;
best_prev_ptr=prev_ptr;
}
if(hp->h_len>=clicks && best_ptr!=NIL_HOLE){
//如果块大小小于当前的最佳适配块,则更新当前最佳适配块
if(hp->h_len < best_ptr->h_len){
best_ptr=hp;
best_prev_ptr=prev_ptr;
}
}
prev_ptr= hp ;
hp=hp->h_next;
}
(3)实现break.c函数
· 修改/usr/src/servers/pm/break.c中的adjust函数,完成函数allocate_new_mem的定义并增加一个allocate_new_mem局部函数在adjust函数中调用。
break.c函数的作用:do_brk函数计算数据段新的边界,然后调用adjust函数计算程序当前的空闲空间是否足够分配:
(a)若足够,则调整数据段指针,堆栈指针并通知内核程序的映像发生了变化,返回do_brk函数。
(b)若不够,则调用allocate_new_mem函数申请新的足够大的内存空间。
//计算栈底指针=栈顶指针+栈大小
base_of_stack = (long) mem_sp->mem_vir + (long) mem_sp->mem_len;
//byte与click单位转换,得到新的栈顶指针
sp_click = sp >> CLICK_SHIFT;
if (sp_click >= base_of_stack) return(ENOMEM