第1关版本1内核执行的完整系统调用序列
任务描述
分析版本1内核,回答下列问题: 从系统开机直到输出第 4 个字符‘1’,系统依次执行了哪些系统调用?分别是在几号进程中执行的?(对于一组连续出现的 0 号进程 pause 系统调用,每组只保留 1 个)
相关知识
为了完成本关任务,你需要掌握: 1.跟踪系统调用的发生; 2.查看当前进程的进程号; 3.跳过 0 号进程发出的连续多个 pause 系统调用; 4.捕获到系统调用时自动显示系统调用号和实现函数名。
实验过程及答案
如果题目要求在版本0
cd 0/linux make
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.tgz 1
rm -rf cur ln -s 1 cur ls
cd 1/linux make
cd ../.. ./rungdb
另开一个终端
cd os/linux-0.11-lab ./mygdb
此时继续输入c会发现全是pause
第2关在版本1中输出系统调用信息
任务描述
本关任务:修改版本 1 内核,使得每次产生系统调用时,都在屏幕上输出系统调用号和当前进程号。(形式如29(0)
,表示0 号进程执行了系统调用 pause
) (对于一组连续出现的 0 号进程 pause 系统调用,每组只保留 1 个)。
相关知识
为了完成本关任务,你需要掌握: 1.内核态下的字符输出; 2.如何在汇编程序中调用一个 C 函数并传递参数; 3.如何只输出 1 次信息; 4.系统调用的编号与名字之间的对应关系。
环境准备
本关卡使用版本 1 内核进行修改,文件存放在/data/workspace/myshixun/exp1
中。
实验过程及答案
ls /data/workspace/myshixun/exp1 cp /data/workspace/myshixun/exp1/1.tgz ~/os
cd os/linux-0.11-lab tar -zxvf ../1.tgz 1
rm -rf cur ln -s 1 cur ls
在main.c最后补上以下这段 插入这个
第3关在版本0中输出系统调用信息
任务描述
本关任务:修改版本 0 内核,使得每次产生系统调用时(忽略 0~3 号进程产生的系统调用),都在屏幕上输出系统调用号和当前进程号。(形式如11(6)
,表示 6 号进程执行了系统调用 execve )
相关知识
为了完成本关任务,你需要掌握: 1.内核态下的字符输出; 2.如何在汇编程序中调用一个 C 函数并传递参数; 3.系统调用的编号与名字之间的对应关系。
环境准备
本关卡使用版本 0 内核进行修改,请确认cur
指向是否正确。
实验过程及答案
rm -rf cur ln -s 1 cur ls
在最后加
加入这个
cd 0/linux make
第4关为版本0内核增加一个系统调用getjiffies
任务描述
为版本 0 内核增加一个系统调用 getjiffies,其功能是获得全局变量 jiffies 的值;同时,在系统启动时自动调用该系统调用并输出结果,画面类似如下:
要求:该系统调用的接口函数取名为 getjiffies(),没有参数。
相关知识
为了完成本关任务,你需要掌握: 1.系统调用的执行过程是怎样的; 2.如何在内核中增加一个函数; 3.如何跟踪系统调用的发生?
编程要求
为版本 0 内核增加一个系统调用 getjiffies,其功能是获得全局变量 jiffies 的值;同时,在系统启动时自动调用该系统调用并输出结果,画面类似如下:
实验过程及答案
还是0内核所以不做修改
sys.c
sys.h
unistd.h
system_call.s
main.c
cd 0/linux make
第5关在用户程序中使用新增的系统调用
任务描述
本关任务: 1.编写一个这样的用户程序 mytest
:调用上一关新增的系统调用 getjiffies
,并将结果输出,系统运行画面类似如下(使用上一关开发的内核):
2.修改文件 /etc/rc
,使系统启动时自动运行该用户程序,修改内容如下图所示:
相关知识
为了完成本关任务,你需要掌握: 1.如何在用户程序中定义一个系统调用接口函数? 2.如何将文件放入 bochs 虚拟机? 3.在 bochs 虚拟机中如何编辑文件? 4.在 bochs 虚拟机中如何编译文件? 5.系统调用的执行过程是怎样的? 6.如何跟踪系统调用的发生?
编程要求
1.编写一个这样的用户程序 mytest
:调用上一关新增的系统调用 getjiffies
,并将结果输出,系统运行画面类似如下(使用上一关开发的内核):
2.修改文件 /etc/rc
,使系统启动时自动运行该用户程序,修改内容如下图所示:
实验过程及答案
用vscode编写如下程序
注释掉之前写的print_nr
运行虚拟机即可
以下为虚拟机内操作
、
注意mcopy b:test . 后面不要落下 .
uemacs /etc/rc
- 保存文件,可以使用命令:Ctrl-X Ctrl-S。
- 退出 uemacs,可以使用命令:Ctrl-X Ctrl-C。
重启虚拟机即可