操作系统课程实验报告(三)

来源:互联网 发布:罗斯科的画 知乎 编辑:程序博客网 时间:2024/06/05 03:24

这是实验楼操作系统课程(李治军老师教学)的第三个实验——系统调用——的实验报告。


报告正文

我认为做这个实验,先在脑海中把系统调用的过程理一次,再动手会好一些,以下实验报告也会根据这个思路进行。

一个应用程序,在编译的过程中,将它使用的 API展开成包含一系列(也有可能没有)系统调用的语句。根据我现在的理解,也就是展开成调用了 int 0x80中断的内嵌汇编的形式。

首先从 int 0x80入手修改。int 0x80会在 IDT 中找到相对应的中断描述符,从而找到中断例程的入口,然后进行执行这个例程,到这一步为止我们都还并不需要修改文件。

接下来,int 0x80会去执行system_call函数了,kernel/system_call.s是我们需要修改的,仅需要改nr_system_calls = 74,这个数字说明int 0x80中断可以提供多少种功能(调用),由于我们需要添加两个调用,所以将72改为74





现在system_call要执行了,它根据传进来的系统调用号(放在eax中)来执行相应的系统调用,它根据include/linux/sys.h中的定义的函数指针数组来找到这个调用的函数入口,所以我们要在sys.h中加入我们需要的两个调用的函数指针 sys_iam sys_whoami,然后用两条extern声明表示这两个函数的实现在别的文件里。




来到这里,我们已经指明了 int 0x80中断怎么寻找我们新增的两个调用了,接下来就是真正去实现sys_iamsys_whoami了,将这两个函数的实现放在kernel/who.c中。这里我写了好几个printk函数用于调试,因为我不会用gdb。说实话编写who.c的时候我遇到的最大的困难是不知道要包含哪些头文件,我只包含了几个我能搞清楚的头文件(包括printk的头文件等),侥幸实验成功。




最后,我们修改一下makefile,这个跟着实验提示做就好,一般没啥大问题。

make完了,就跑虚拟机吧!

在虚拟机下面,修改usr/include/unistd.h,增加两个调用号的宏和函数声明,将来编写的应用程序里的API包含这个头文件,才能顺利展开成包含int 0x80 的形式。





然后在虚拟机下编写两个应用程序 iam.c whoami.c,测试新增的两个调用,输出符合预期即可。



原创粉丝点击