实验步骤
(1)了解应用程序如何调用系统调用
在通常情况下,调用系统调用和调用一个普通的自定义函数在代码上并没有什么区别,但调用后发生的事情有很大不同。调用自定义函数是通过call指令直接跳转到该函数的地址,继续运行。而调用系统调用,是调用系统库中为该系统调用编写的一个接口函数,叫API(Application Programming Interface)(它对应一个宏_syscallx,在unistd.h中)。API并不能完成系统调用的真正功能,它要做的是去调用真正的系统调用,过程是:
- 把系统调用的编号存入EAX
- 把函数参数存入其它通用寄存器
- 触发0x80号中断(int 0x80)
- 接下来就是内核的中断处理了,自动调用函数system_call(在kernel/system_call.s中),到sys_call_table找到系统调用号对用的系统调用sys_xxx,执行它。
(2)阅读文件lib/close.c、fs/open.c、kernel/system_call.s、include/unistd.h、include/linux/sys.h,找出系统调用close与这些文件之间的关系,清晰close系统调用的过程;
(3)参照系统调用close,在上面一系列文件中添加或修改系统调用iam和whoami相关的内容(系统调用号、系统调用表、系统调用总数等);
(4)创建who.c文件,在其中分别编写包含具体实现细节的sys_iam()和sys_whoami()函数;
(5)修改Makefile,以便在执行make命令时可以编译who.c文件;
(6)编译linux内核,运行bochs;
(7)编写测试程序iam.c和whoiam.c;
(8)将测试程序、unistd.h及测试脚本复制到 hdc目录,以便bochs启动后能够共享这些文件;
(9)运行bochs;
(10)在虚拟机上编译测试程序iam.c和whoiam.c,并运行测试;
(11)运行测试脚本,测试得分情况。
此次实验需要修改unistd.h sys.h system_call.s makefile,并编写who.c iam.c whoami.c
(1)修改linux-0.11/include/linux/sys.h
根据Linux调用系统调用的过程,需要把 iam()与whoami()两个函数加到全局变量,和中断函数表中就可以了,中断被调用的时候,先查找中断向量表,找到相应的函数名,调用其函数。
分别添加声明到最下面和数组中
extern int sys_setup();
extern int sys_exit();
extern int sys_fork();
extern int sys_read();
extern int sys_write();
extern int sys_open();
extern int sys_close();
extern int sys_waitpid();
extern int sys_creat();
extern int sys_link();
extern int sys_unlink();
extern int sys_execve();
extern int sys_chdir();
extern int sys_time();
extern int sys_mknod();
extern int sys_chmod();
extern int sys_chown();
extern int sys_break();
extern int sys_stat();
extern int sys_lseek();
extern int sys_getpid();
extern int sys_mount();
extern