课后作业2.3:系统调用

d7a380e920d3488cb64f6dc679aabf49.png

第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

94131b9c442641aca067c450afc62e04.png

cd os/linux-0.11-lab
tar -zxvf ../1.tgz 1

de0ebd3263cc4230a9de53bf430dcc0c.png

rm -rf cur
ln -s 1 cur
ls

f12d91d64d9c4b5db1cbd88daf504c59.png

cd 1/linux
make

ee35757477f1428b93032742a723085e.png

cd ../..
./rungdb

23f0bde27ee344dd940cda4d4cb7acf8.png

另开一个终端

cd os/linux-0.11-lab
./mygdb

164f5c0adaf1445daea419b6f8c24e68.png

718336169dc84b70b29caa1890e0d803.png

e61eec5b4c544f3493d2b313be3dfe26.png

2345db5844b7406bba6fe8cfe6516111.png

e56d1295d4b94d11a282fa028174511a.png

2a3777392dd54b24a6bae4fa29f6ec8f.png

此时继续输入c会发现全是pause

c0da60e194b241b0af7dac9e66a072f7.png

7ff5731eff8b4d3987fd8298ac069bdb.png

 

第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

94131b9c442641aca067c450afc62e04.png

cd os/linux-0.11-lab
tar -zxvf ../1.tgz 1

de0ebd3263cc4230a9de53bf430dcc0c.png

rm -rf cur
ln -s 1 cur
ls

f12d91d64d9c4b5db1cbd88daf504c59.png

598d7b526956440aa6c107ffd9c7fd68.png 2911a436da81419fb5d7cabda8005e2a.png 86b142c12026466392b9d03542883ed1.png 09548b82e8df47668551d5a29732944c.png efa12485c1064c0f9339befdda4a5053.png在main.c最后补上以下这段 f04ba010d0174e839c902ee0fa0de2b5.png e765a57d62a940be831bec7505b67d65.png插入这个 7178bdea287845da90bb8bf1307e928c.png 3e230b7922e941b3bb8d4328ca955f8d.png

 

第3关在版本0中输出系统调用信息

任务描述

本关任务:修改版本 0 内核,使得每次产生系统调用时(忽略 0~3 号进程产生的系统调用),都在屏幕上输出系统调用号和当前进程号。(形式如11(6),表示 6 号进程执行了系统调用 execve )

相关知识

为了完成本关任务,你需要掌握: 1.内核态下的字符输出; 2.如何在汇编程序中调用一个 C 函数并传递参数; 3.系统调用的编号与名字之间的对应关系。

环境准备

本关卡使用版本 0 内核进行修改,请确认cur指向是否正确。

实验过程及答案

rm -rf cur
ln -s 1 cur
ls

f12d91d64d9c4b5db1cbd88daf504c59.png

d6144bac26c2482f9a94d550218638ad.pngb16483d1388743728d5026a8017b9cd9.png44438e93119c4f9285c53d28f7659981.png

在最后加103f175c43624591a32b40629de9d58c.pngb5198b2b442d481bb984ae7ddcbe139d.png

6a735ae2dceb4505a4a1f7bd46f08ff7.png

加入这个bedadfa3b3024d92a568ba0138615b00.png

cd 0/linux
make

070d6101a0204350a2fadc4db39b8f82.png

 

第4关为版本0内核增加一个系统调用getjiffies

任务描述

为版本 0 内核增加一个系统调用 getjiffies,其功能是获得全局变量 jiffies 的值;同时,在系统启动时自动调用该系统调用并输出结果,画面类似如下:

 

a95d6ef290d73576fd9065ed32fbafe4.png

要求:该系统调用的接口函数取名为 getjiffies(),没有参数。

相关知识

为了完成本关任务,你需要掌握: 1.系统调用的执行过程是怎样的; 2.如何在内核中增加一个函数; 3.如何跟踪系统调用的发生?

编程要求

为版本 0 内核增加一个系统调用 getjiffies,其功能是获得全局变量 jiffies 的值;同时,在系统启动时自动调用该系统调用并输出结果,画面类似如下:

a95d6ef290d73576fd9065ed32fbafe4.png

实验过程及答案

还是0内核所以不做修改

sys.c

2205ebf090074ec9ab15dbd2a7f02ca7.png01d4d38d0871495da98da995dba238a1.png

sys.h

16220259f008471d899174961b0a56e8.pngd9c9077130be40b8b7aef45695ca5602.png90289ffc80a94a09bb1ac6680d5ad7d3.png

unistd.h

328bccfa32a346608aab74e9081747eb.png

system_call.s

2c5b7d527cd84de3a351b2b8d8738c03.png

main.c

13fe41cbbf594c279d8333ebf73b1138.png

c0e5378792c945c8a1f0e78b7bef5413.png

cd 0/linux
make

070d6101a0204350a2fadc4db39b8f82.png

 

第5关在用户程序中使用新增的系统调用 

任务描述

本关任务: 1.编写一个这样的用户程序 mytest:调用上一关新增的系统调用 getjiffies,并将结果输出,系统运行画面类似如下(使用上一关开发的内核):

 

5103ad4d5040ba23d176bb0c4e60725f.png

2.修改文件 /etc/rc ,使系统启动时自动运行该用户程序,修改内容如下图所示:

 

f3fe9fded31ed43e4e4894c3b1ecd655.png

相关知识

为了完成本关任务,你需要掌握: 1.如何在用户程序中定义一个系统调用接口函数? 2.如何将文件放入 bochs 虚拟机? 3.在 bochs 虚拟机中如何编辑文件? 4.在 bochs 虚拟机中如何编译文件? 5.系统调用的执行过程是怎样的? 6.如何跟踪系统调用的发生?

编程要求

1.编写一个这样的用户程序 mytest:调用上一关新增的系统调用 getjiffies,并将结果输出,系统运行画面类似如下(使用上一关开发的内核):

5103ad4d5040ba23d176bb0c4e60725f.png

2.修改文件 /etc/rc ,使系统启动时自动运行该用户程序,修改内容如下图所示:

f3fe9fded31ed43e4e4894c3b1ecd655.png

实验过程及答案

用vscode编写如下程序

cd50ab8bf2904ea99c71d9ceb26f04d2.png

 

注释掉之前写的print_nr7819155a07b448579210a270b133f3ec.png

14f1140ec3dd4c71bb4f98a093c7dac6.png

6248b6ac1d6045ecb17953b18c6ea054.png

3ac9a7390fae4a008a4e2ce13b15e053.png

运行虚拟机即可

a724afbab512479fa503244ab138d908.png

以下为虚拟机内操作

ff3ac00d64ce4077b67f1391f469a78c.png

注意mcopy b:test .  后面不要落下 .

17173ef6e3534884a910894b0b14e890.pnge3767336f0694463a641485e4d334995.png

uemacs /etc/rc

64dc6583d7584815b2cdf308096cce13.png

  1. 保存文件,可以使用命令:Ctrl-X Ctrl-S。
  2. 退出 uemacs,可以使用命令:Ctrl-X Ctrl-C。

 

21e5296143b44d54aa947862c725df96.png

重启虚拟机即可

7b85ed50cca648f0be86bd57fe52abdd.png

 

 

  • 11
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItsNorth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值