操作系统实验2:系统调用
实验内容请查看实验指导手册
- 实验需要掌握的知识点:
如何使用用户函数调用系统函数、_syscall宏的含义以及作用、管理使用linux系统的基本知识- 实验中添加和修改的文件
(1)添加了:
iam.c(路径:oslab/hdc/usr/root)
whoami.c(路径:oslab/hdc/usr/root)
who.c(路径:oslab/linux-0.11/kernel)
(2)修改了:
unistd.h(路径:oslab/hdc/include/unistd.h)
system_call.s(路径:oslab/linux-0.11/kernel/system_call.s)
sys.h(路径:oslab/linux-0.11/include/linux/sys.h)
Makefile(路径:oslab/linux-0.11/kernel/Makefile)
绪论
我花了很长的时间,才搞清楚这个实验,干了一件什么事情:
- 在用户层面写了两个程序iam.c和whoami.c,通过syscall这个宏开启调用系统函数的窗口,调用sys_iam以及sys_whoami系统函数。
- 编写了两个函数sys_iam以及sys_whoami,以who.c的文件格式保存在了linux0.11系统的内核(kernel)中;
- sys_iam调用了一个名为get_fs_byte()的系统函数实现数据读取输入,sys_whoami则调用了put_fs_byte()这个系统函数完成对数据的打印输出。
- 整个实验就是作了一件这么简单的事情,至于修改了Makefile等文件的复杂操作,可以理解为让上述过程实现的辅助过程。
下面是具体的实验过程:
一、实验内容
1.编写iam以及whoami程序
iam.c的代码
#define __LIBRARY__
#include <unistd.h>
//_syscall1宏展开后是一个调用系统函数的函数
_syscall1(int, iam, const char*, name);
int main(int argc,char ** argv)
{
int wlen = 0;
if(argc<1)
{
printf("not enough arguments!\n");
return -2;
}
wlen = iam(argv[1]);
return wlen;
}
whoami.c的代码
#define __LIBRARY__
#include <unistd.h>
//_syscall2是宏,宏展开后是一个调用系统函数的函数
_syscall2(int, whoami,char*,name,unsigned int,size);
int main()
{
char s[30];
int rlen = 0;
rlen = whoami(s,30);//这里调用了_syscall2写的whoami函数
printf("%s\n",s);
return

本文详细介绍了如何在Linux0.11中添加自定义系统调用,包括编写用户程序、定义系统调用号、修改内核文件、实现内核函数及编译运行。实验涉及iam和whoami两个程序,通过系统调用实现数据的读取与输出。测试部分使用testlab2.c和testlab2.sh验证了系统调用的正确性。

8371

被折叠的 条评论
为什么被折叠?



