实验二系统调用.doc

实验二系统调用.doc

ID:59574184

大小:41.50 KB

页数:12页

时间:2020-11-12

实验二系统调用.doc_第1页
实验二系统调用.doc_第2页
实验二系统调用.doc_第3页
实验二系统调用.doc_第4页
实验二系统调用.doc_第5页
资源描述:

《实验二系统调用.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、实验目的<编辑>·建立对系统调用接口的深入认识·掌握系统调用的基本过程·能完成系统调用的全面控制·为后续实验做准备实验内容<编辑>此次实验的基本内容是:在Linux0.11上添加两个系统调用,并编写两个简单的应用程序测试它们。iam()第一个系统调用是iam(),其原型为:intiam(constchar*name);完成的功能是将字符串参数name的内容拷贝到内核中保存下来。要求name的长度不能超过23个字符。返回值是拷贝的字符数。如果name的字符个数超过了23,则返回“-1”,并置errno为EINVAL。在kernal

2、/who.c中实现此系统调用。whoami()第二个系统调用是whoami(),其原型为:intwhoami(char*name,unsignedintsize);它将内核中由iam()保存的名字拷贝到name指向的用户地址空间中,同时确保不会对name越界访存(name的大小由size说明)。返回值是拷贝的字符数。如果size小于需要的空间,则返回“-1”,并置errno为EINVAL。也是在kernal/who.c中实现。测试程序运行添加过新系统调用的Linux0.11,在其环境下编写两个测试程序iam.c和whoami.c

3、。最终的运行结果是:$./iamlizhijun$./whoamilizhijun实验报告<编辑>在实验报告中回答如下问题:1.从Linux0.11现在的机制看,它的系统调用最多能传递几个参数?你能想出办法来扩大这个限制吗?2.用文字简要描述向Linux0.11添加一个系统调用foo()的步骤。评分标准<编辑>·将 testlab2.c 在修改过的Linux0.11上编译运行,显示的结果即内核程序的得分。满分50%·只要至少一个新增的系统调用被成功调用,并且能和用户空间交换参数,可得满分·将脚本 testlab2.sh 在修改过

4、的Linux0.11上运行,显示的结果即应用程序的得分。满分30%·实验报告,20%实验提示<编辑>首先,请将Linux0.11的源代码恢复到原始状态。《注释》的5.5节详细讲述了0.11如何处理系统调用,是非常有价值的参考。操作系统实现系统调用的基本过程是:1.应用程序调用库函数(API);2.API将系统调用号存入EAX,然后通过中断调用使系统进入内核态;3.内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);4.系统调用完成相应功能,将返回值存入EAX,返回到中断处理函数;5.中断处理函数返回到API中;6

5、.API将EAX返回给应用程序。应用程序如何调用系统调用在通常情况下,调用系统调用和调用一个普通的自定义函数在代码上并没有什么区别,但调用后发生的事情有很大不同。调用自定义函数是通过call指令直接跳转到该函数的地址,继续运行。而调用系统调用,是调用系统库中为该系统调用编写的一个接口函数,叫API(ApplicationProgrammingInterface)。API并不能完成系统调用的真正功能,它要做的是去调用真正的系统调用,过程是:·把系统调用的编号存入EAX·把函数参数存入其它通用寄存器·触发0x80号中断(int0x8

6、0)0.11的lib目录下有一些已经实现的API。Linus编写它们的原因是在内核加载完毕后,会切换到用户模式下,做一些初始化工作,然后启动shell。而用户模式下的很多工作需要依赖一些系统调用才能完成,因此在内核中实现了这些系统调用的API。我们不妨看看lib/close.c,研究一下close()的API:#define__LIBRARY__#include_syscall1(int,close,int,fd)其中_syscall1是一个宏,在include/unistd.h中定义。将_syscall1(

7、int,close,int,fd)进行宏展开,可以得到:intclose(intfd){long__res;__asm__volatile("int$0x80":"=a"(__res):"0"(__NR_close),"b"((long)(fd)));if(__res>=0)return(int)__res;errno=-__res;return-1;}这就是API的定义。它先将宏__NR_close存入EAX,将参数fd存入EBX,然后进行0x80中断调用。调用返回后,从EAX取出返回值,存入__res,再通过对__res的判

8、断决定传给API的调用者什么样的返回值。其中__NR_close就是系统调用的编号,在include/unistd.h中定义:#define__NR_close6所以添加系统调用时需要修改include/unistd.h文件,使其包含__NR_whoami和__

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。