第1关:版本 0 内核中的进程调度分析
任务描述
当程序 01.c 运行时(在版本 0 内核中),会在父子两个进程(假设分别为 6 号和 7 号进程)中分别输出字符串0
和1
。
请问:从 6 号进程刚创建完 7 号进程开始,在接下来的 9 次进程调度中,每次调度时,6 号和 7 号进程的剩余时间片是多少?选中的新进程是几号?
实验准备
本关卡使用版本 0 内核进行分析,01.c 存放在/data/workspace/myshixun/exp5
中。
代码及答案
1.首先将该文件放入目录linux-0.11-lab/b/
下
打开一个终端,输入cp
打开workspace文件,从myshixun到exp5目录下,拖动01.c文件到终端,就会自动生成对应路径
然后在路径后面空一格,输入如下,将01.c拷贝到/b文件夹下
上述过程也可以用代码实现
cp /data/workspace/myshixun/exp5/01.c ~/os/linux-0.11-lab/b/
切换到linux-0.11-lab目录下启动虚拟机
cd os/linux-0.11-lab
./run
在bochs中输入以下内容,用mcopy命令将该文件拷入虚拟机硬盘,用ls命令检查
注意mcopy那行最后有个点,说明拷贝到当前文件位置
然后就是它给的教程上没给到的,在这一步要添加一个编译命令
回车后就完成了
然后关闭虚拟机窗口,开启gdb调试
先将 main 函数处的断点关闭,然后在函数 do_execve 处设断点
和教程上有所不同,我这里显示没有这个1断点(不管它)
上图表明可执行文件/bin/sh
开始执行了,参数 filename 是要执行文件的名字。
为了准确起见,最好以如下方式自动显示可执行文件名(commands内的内容,笔者出于偷懒防止出错的心,没写commands 2的内容,即commands到end的代码,不写执行也可以成功)
然后连续摁3个c
摁到最后一个c的时候回到bochs页面,虚拟机等待输入( gdb 不响应)
这个时候不要跟着教程做ls追踪,直接输入./01即可
回到gdb是如下页面
继续输入
按照下图继续输入。
(提示:commands的printf内容最好不要输错,输入完成后检查几遍,如果一不小心输错了,在后续报错之后,重新开启commands再输入一遍即可,并且要注意下图输入一遍之后已经摁了一个c。如果不能通过重新输入commands来修改的话笔者采取重新实验的方法)
然后连续输入9个c
2.填写txt,写完保存(注意最后一行不是gdb输入最后一个c显示的那行,而是上一调度的时间片)
评测就可以看到通关了