第1关版本1内核执行的完整系统调用序列
任务描述
分析版本1内核,回答下列问题: 从系统开机直到输出第 4 个字符‘1’,系统依次执行了哪些系统调用?分别是在几号进程中执行的?(对于一组连续出现的 0 号进程 pause 系统调用,每组只保留 1 个)
相关知识
为了完成本关任务,你需要掌握: 1.跟踪系统调用的发生; 2.查看当前进程的进程号; 3.跳过 0 号进程发出的连续多个 pause 系统调用; 4.捕获到系统调用时自动显示系统调用号和实现函数名。
实验过程及答案
第2关在版本1中输出系统调用信息
任务描述
本关任务:修改版本 1 内核,使得每次产生系统调用时,都在屏幕上输出系统调用号和当前进程号。(形式如29(0)
,表示0 号进程执行了系统调用 pause
) (对于一组连续出现的 0 号进程 pause 系统调用,每组只保留 1 个)。
相关知识
为了完成本关任务,你需要掌握: 1.内核态下的字符输出; 2.如何在汇编程序中调用一个 C 函数并传递参数; 3.如何只输出 1 次信息; 4.系统调用的编号与名字之间的对应关系。
环境准备
本关卡使用版本 1 内核进行修改,文件存放在/data/workspace/myshixun/exp1
中。
实验过程及答案
第3关在版本0中输出系统调用信息
任务描述
本关任务:修改版本 0 内核,使得每次产生系统调用时(忽略 0~3 号进程产生的系统调用),都在屏幕上输出系统调用号和当前进程号。(形式如11(6)
,表示 6 号进程执行了系统调用 execve )
相关知识
为了完成本关任务,你需要掌握: 1.内核态下的字符输出; 2.如何在汇编程序中调用一个 C 函数并传递参数; 3.系统调用的编号与名字之间的对应关系。
环境准备
本关卡使用版本 0 内核进行修改,请确认cur
指向是否正确。
实验过程及答案
第4关为版本0内核增加一个系统调用getjiffies
任务描述
为版本 0 内核增加一个系统调用 getjiffies,其功能是获得全局变量 jiffies 的值;同时,在系统启动时自动调用该系统调用并输出结果,画面类似如下:
要求:该系统调用的接口函数取名为 getjiffies(),没有参数。
相关知识
为了完成本关任务,你需要掌握: 1.系统调用的执行过程是怎样的; 2.如何在内核中增加一个函数; 3.如何跟踪系统调用的发生?
编程要求
为版本 0 内核增加一个系统调用 getjiffies,其功能是获得全局变量 jiffies 的值;同时,在系统启动时自动调用该系统调用并输出结果,画面类似如下:
实验过程及答案
还是0内核所以不做修改
第5关在用户程序中使用新增的系统调用
任务描述
本关任务: 1.编写一个这样的用户程序 mytest
:调用上一关新增的系统调用 getjiffies
,并将结果输出,系统运行画面类似如下(使用上一关开发的内核):
2.修改文件 /etc/rc
,使系统启动时自动运行该用户程序,修改内容如下图所示:
相关知识
为了完成本关任务,你需要掌握: 1.如何在用户程序中定义一个系统调用接口函数? 2.如何将文件放入 bochs 虚拟机? 3.在 bochs 虚拟机中如何编辑文件? 4.在 bochs 虚拟机中如何编译文件? 5.系统调用的执行过程是怎样的? 6.如何跟踪系统调用的发生?
编程要求
1.编写一个这样的用户程序 mytest
:调用上一关新增的系统调用 getjiffies
,并将结果输出,系统运行画面类似如下(使用上一关开发的内核):
2.修改文件 /etc/rc
,使系统启动时自动运行该用户程序,修改内容如下图所示:
实验过程及答案
以下为虚拟机内操作