首先进入实验楼后,解压目标文件,做一下初始化的工作。
cd /home/shiyanlou/oslab
tar -zxvf hit-oslab-linux-20110823.tar.gz -C /home/shiyanlou
1. 在linux-0.11/include/linux/sys.h中添加函数声明extern int sys_iam()和extern int sys_whoami(); 然后在中断向量表fn_ptr sys_call_table[]的最后面填上系统调用sys_iam()和sys_whoami()。
cd ./linux-0.11/include/linux
vim sys.h
打开sys.h后,可以看到如下图的代码,其中红色圈起来的是我们要添加的内容:
即先添加函数声明:
extern int sys_iam();
extern int sys_whoami();
再在中断向量表最后面添加:sys_iam, sys_whoami
2.在linux-0.11/kernel/system_call.s中修改系统调用的个数nr_system_calls,使其增加2。
cd ../../kernel
vim system_call.s
如图所示,将nr_system_calls由72改成74.
**3.新增系统调用号,在虚拟机中修改unistd.h。先通过运行sudo ./mount-hdc 把虚拟机硬盘挂载在oslab/hdc目录下,然后在hdc/usr/include目录下修改unistd.h。
增加#define __NR_iam 72 和 #define __NR_whoami 73
首先运行mount-hdc来把虚拟机硬盘挂载在oslab/hdc目录下,然后切换目录打开unistd.h
cd ../../
sudo ./mount-hdc
cd ./hdc/usr/include
vim unistd.h
如图添加#define __NR_iam 72 和 #define __NR_whoami 73
4.新增who.c文件,实现系统调用的函数
切换目录到linux-0.01/kernel ,在这里创建一个who.c文件。
cd ../../../linux-0.11/kernel
vim
在这里首先要说明题目中的要求文件中iam()函数 “ 如果 name 的字符个数超过了 23,则返回 “-1”,并置 errno 为 EINVAL。”
这里我觉得可能是写错了?我在代码中返回-1后是通不过最后的测试的,只有返回EINVAL才可以通过测试。也就是说,EINVAL是错误代码的一个取值,题目实际上应该是让我们返回这个值EINVAL;同时<errno.h>头文件会自动帮我们把变量errno置为对应的错误码EINVAL,所以我们就不用再写errno = EINVAL 了。在代码中<errno.h>头文件定义了错误代