P4:内存管理
目标
- 熟悉MINIX操作系统的进程管理
- 学习Unix风格的内存管理
实验要求
修改MINIX3.1.2a的进程管理器,改进brk系统调用的实现。
使得分配给进程的数据段+栈段空间耗尽时,该brk系统调用会
给该进程一个更大的内存空间,
并将原来空间中的数据复制到新分配的内存空间。
释放原来的内存空间
通知内核映射新分配的内存段。
MINIX3 独立ID空间,共享相同的代码段。
Safety:使进程正常执行一小段时间,使其在执行这段时间的过程中,打印出此时“我出错了ENOMEM”(因为我本身不应该运行到safety内存中)和正常结束。
当空间消耗殆尽时,要增加空间,此时会有更大的空间来执行,使之继续地正常执行下去。
实验说明
修改/usr/src/servers/pm/break.c中的adjust函数。
在adjust函数中增加allocate_new_mem局部函数。
brk系统调用本身:
Do_brk函数计算数据段新的边界
然后调用adjust函数,使用adjust函数来计算当前程序的空闲空间是否足够分配。
足够分配:
不够分配:调用allocate_new_mem函数申请新的足够大的内存空间。
足够大的内存空间的申请和寻找是first-fit -> best-fit.
将数据段和栈段拷贝:数据段底部,栈段顶部
编译MINIX
编译kernel后要把kernel的编号进行记住
5是选项,save是进行保存。
新生成的kernel是会变化的。
Project4也是又又又又需要配环境的一次haha!
- 下载Minix3.1.2镜像文件
- 在VMware中新建虚拟机,按照P1过程进行虚拟机的配置。
- 然后就不能传文件啦!
- 然后我把NAT的网络连接模式换了一种以后,就又可以传文件了~终于啊QAQ 我古董的windows重装都配好环境惹…
另记:传文件是玄学,编译时玄学,内核是玄学,cc是玄学,计算机是玄学。
主体思路就是对于allocate_new_mem函数进行调整。
1 | /* Memory map for local text, stack, data segments. */ |
Allocate_new_mem函数的整体内容:
- Alloc_mem分配内存
- Sys_abscopy拷贝内容
- 释放
- 通知内核相关变动并注册
1 | PUBLIC int allocate_new_mem(rmp,old_memory_clicks) |
- 通知变化是在if分支里面的,所以不需要sys_newmap
TNND,终于写完了。