没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
2.0 实验平台
主机win10上开发;
虚拟机ubuntu18.04(x86_64架构)上编译链接,并将二进制的可执行代码写入镜像文件a.img,并运行
硬件级虚拟机bochs;
由bochs 来运行我们写出来的“伪操作系统”,也就是包含可执行程序的镜像a.img;
2.1 选用框架: 第七章m
2.2 开始实验的思路
阅读《orange's》第六章和第七章的部分内容,然后尝试开始完成第一个目标,添加系统调用让进程休
眠,不被分配时间片。
然后照葫芦画瓢,写出 print;
对于读者写者问题,首先弄明白整个项目的执行流程(主要是时钟中断处理程序clock_handler和调度算
法schedule),然后写出信号量和PV操作的数据结构(定义清晰的API),写出6个进程的雏形,然后依
次分析和完成读者优先算法、写者优先、读写公平这三种算法,在算法完成的过程中还要考虑定义哪些
信号量、如何初始化等等。
过程中的一些细节问题,比如清屏,比如如何彩色打印进程信息,比如makefile,比如bochs的时间配
置等等,在实验时慢慢解决。
3.修改makefile
将第七章m源码复制粘贴过来,首先修改makefile,以让原项目能直接运行起来。
3.1 64位虚拟机上支持32位模式的编译和链接
3.2 make run命令和挂载目录
做出以上三处修改以后,在该目录打开的终端里,输入make run,再输入c,退出bochs的调试模式,
发现bochs运行正常。
4.清屏功能 clear
在Lab3中已经写过一次清屏功能了,本来想抄自己以前写的clear(),但这次实验没有要求游标跟随输
出,如果不设置游标,可以直接在显存上修改,直接把显存全部改成空格,非常简单。
这里的全局变量 disp_line 负责记录输出的行数,一个屏幕输出 25 * 80个字符,即最多25行,超过25行
就在时钟中断模块里调用clear()清屏。
5.系统调用 sleep
5.1 添加系统调用的八股文
根据书第二版295页,添加系统调用 foo 的过程如下:
步骤 内容 文件
1 NR_SYS_CALL加一 const.h
2 sys_call_table[]增加一个成员sys_foo global.c
3 sys_foo函数体定义 不确定
4 sys_foo函数声明 proto.h
5 foo的函数声明 proto.h
6 _NR_foo的定义 syscall.asm
7 foo的函数体 syscall.asm
8 global foo 导出foo 这个函数标识符 syscall.asm
9 如果参数个数与以前的系统调用相比有增加,要修改sys_call kernel.asm
其中相对麻烦的不过就是步骤3和6,其他都是照本宣科。
按照上面的9个步骤,添加系统调用sleep,值得注意的是系统调用sleep除eax外,只接受1个参数
milli_seconds,而之前的系统调用get_ticks不需要参数,所以步骤9是需要的,不需要修改sys_call;
步骤3: sys_sleep可以先在定义时忽略函数体,把其他的写好;
步骤6、7、8:
写好其他的以后,思考如何写函数体?如何实现在调用sleep以后,在milli_seconds毫秒内不被分
配时间片?
显然,可以让它记录一些值——sleep_ticks,休眠多少时间,然后直接通过调度算法,把时间片分
给其他进程。
剩余25页未读,继续阅读
KerstinTongxi
- 粉丝: 22
- 资源: 277
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0