操作系统实验报告Linux下的系统调用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
----- Linux下的系统调用
计算机10-4 赵俊楠10081407
实验目的:实现多个系统调用实验
实验内容:添加简单系统调用、添加随机抽牌系统调、用模块添加系统调用
实验步骤:
(我是将三个系统调用添加完毕后一起编译的)
1.在usr/src/linux-
2.4/include/asm i386/unistd.h中添加#define __NR_print_info 259和#define __NR_rank 260
2.在usr/src/linux-2.4/arch/i386/kernel/entry.S中添加.long SYMBOL_NAME(sys_print_info)和.long SYMBOL_NAME(sys_rank);
3.在usr/src/linux-2.4/kernel中添加
asmlinkage int sys_rank(int value,int suit)
{
if (value==1) return (int)(4*13+suit);
else return (int)(4*(value-1)+suit);
};和
asmlinkage int sys_print_info(int testflag)
{
printk(KERN_EMERG " It's my syscall function!\n");
return 0;
}
4.在usr/src/linux-2.4/kernel/ksyms中添加
#ifndef __mips__
EXPORT_SYMBOL(sys_call_table);
#endif
至此,三个实验的系统调用添加完毕下面开始编译内核。
5.make clean
make mrproper
make oldconfig
make dep
make bzImage
make modules
make modules_install
make install
在添加系统调用时候一定要专心、仔细,否则在编译的时候会出现错误,改起来很麻烦!!
6.重启Linux后,显示界面如下(没有改内核版本号)
7.进入新内核后不要忘了将#define __NR_print_info 259和#define __NR_rank
260添加到中
8.然后编写三个测试程序分别测试新的系统调用结果如下图:
关于test_print_info
关于card
关于call和test_call
实验总结:
本次实验的内容涉及到Linux的系统调用。所谓系统调用,即操作系统为应用程序提供的与内核进行交互的一组接口。通过此接口,用户态下的应用程序可以转化为内核态,同时调用相应的内核函数运行,从而可以实现应用程序和系统内核的交互。
通过三个实验对Linux的系统调用原理进行验证。第一个实验是简单的系统调用的添加;第二个实验则是丰富了系统调用的功能,实现了一个抽牌的功能,而不仅仅是打印语句;第三个实验则是将编译内核改进成了内核模块的编译,这样在不重启调用编译后内核的前提下插入编译的系统调用内核模块,即可以调用新的系统功能。
对于这次实验,我觉得最大的困难在于如何编译内核。开始的时候只知道make clean 和make dep ,却在make bzImage的时候出现了一堆选项让选y/n/M,后来才知道只要打make oldconfig按原来的配置就可以了。然后是在make bzImage的时候出现了两个错误:一个是字母打错了,一个是位置加错了。又回去改,重新make。make modules花费的时间最长,之后还算很顺利,只不过重启之后系统又自动进入Red Hat 2.4.20-8我不知道,在执行test_print-info的时候显示 i=-1,syscall failed!,以为添加系统调用失败了!!后来才发现是进错了地方。
虽然对于这次实验,大多数内容都已经给出了,但是还是花了我很多时间。过程很纠结,还好最后成功了!
最后,感谢老师在课上关于系统调用知识的讲解,有助于我对本次实验更好的理解。