linux系统调用实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
竭诚为您提供优质文档/双击可除linux系统调用实验报告
篇一:linux系统调用实验报告
西安邮电大学
(计算机学院)
课内实验报告
实验名称:系统调用
专业名称:软件工程
班级:软件
学生姓名:学号(8指导教师:xxxxx
实验日期:20XX年5月31日
一.实验目的及实验环境
实验目的:
1)了解系统调用,学习系统调用函数的使用;
2)理解调用系统调用与直接调用内核函数的区别;
实验环境:ubuntu
二.实验内容
1)对比调用系统调用和直接调用内核函数的区别;
2)跟踪系统调用的执行;
三.实验原理
1)系统调用
系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。
从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。
总的概括来讲,系统调用在系统中的主要用途无非以下几类:
?控制硬件——系统调用往往作为硬件资源和用户空间
的抽象接口,比
如读写文件时用到的write/read调用。
?设置系统状态或读取内核数据——因为系统调用是用
户空间和内核的
唯一通讯手段[2]所以用户设置系统状态,比如开/关某项内核服务
(设
置某个内核变量),或读取内核数据都必须通过系统调用。比如getpgid、getpriority、setpriority、sethostname ?进程管理——一系统调用接口是用来保证系统中进程
能以多任务在虚
拟内存环境下得以运行。比如fork、clone、execve、exit等
第二,什么服务应该存在于内核;或者说什么功能应该实现在内核而不是在用户空间。这个问题并没有明确的答案,有些服务你可以选择在内核完成,也可以在用户空间完成。选择在内核完成通常基于以下考虑:
?服务必须获得内核数据,比如一些服务必须获得中断
或系统时间等内
核数据。
?从安全角度考虑,在内核中提供的服务相比用户空间
提供的毫无疑问
更安全,很难被非法访问到。
?从效率考虑,在内核实现服务避免了和用户空间来回
传递数据以及保
护现场等步骤,因此效率往往要比在用户空间实现高许
多。比如,httpd等服务。
?如果内核和用户空间都需要使用该服务,那么最好实
现在内核空间,
比如随机数产生。
2)KDb使用
将其编译成名为getpid的执行文件“gcc–
ogetpid/getpid.c”,使用KDb来产看它进入内核后的执行
路径。
1、激活KDb(按下pause键,当然你必须已经给内核打
了KDb补丁);设置内核断点“bpsys_getpid”;退出kdb“go”;然后执行./getpid。瞬间,进入内核调试状态,执行路径停
止在断点sys_getpid处。
2、在KDb>提示符下,执行bt命令观察堆栈,发现调用的嵌套路径,可以看到在sys_getpid是在内核函数
system_call中被嵌套调用的。
3、在KDb>提示符下,执行rd命令查看寄存器中的数值,可以看到eax中存放的getpid调用号——0x00000014(=20).
4、在KDb>提示符下,执行ssb(或ss)命令跟踪内核
代码执行路径,可以发现sys_getpid执行后,会返回
system_call函数,然后接者转入ret_from_sys_call例程。(再往后还有些和调度有关其他例程,我们这里不说了它们了。)
结合用户空间的执行路径,该程序大致可归结为以下几个步骤:
1、该程序调用libc库的封装函数getpid。该封装函数将系统调用号_nR_getpid(第20个)压入eAx寄存器,
2、调用软中断int0x80进入内核。
(以下进入内核态)
3、在内核中首先执行system_call,接着执行根据系统调用号在调用表中查找到的对应的系统调用服务例程
sys_getpid。
4、执行sys_getpid服务例程。
5、执行完毕后,转入syscall_exit_work例程,系统
调用中返回。
四.测试数据及运行结果
正常测试数据(3组)及运行结果;
五.总结
系统调用是一层用户进入内核的接口,内核公开的内核函数——export出来的——可以使用命令ksyms或
cat/proc/ksyms来查看。我已经初步认识到了内核的重要性,以后会更加努力的学习。
六.附录:(电子版附源代码)
return0;1)#include}#include
2)/*跟踪系统调用*/#include
#include#include
intmain(void)#include
{#include
longID1,ID2;#include
/*直接调用内核函数
*/intmain(void)ID1=syscall(sYs_getpid);{printf("sys call(sYs_getpid)=%ld\n"longID;,ID1);ID=getpid();/*
调用系统调用
*/printf("getpid()=%ld\n",ID);ID2=getpid();
return0;printf("getpid()=%ld\n",ID2);
}
篇二:操作系统实验报告Linux下的系统调用
操作系统实验报告
-----Linux下的系统调用
计算机10-4赵俊楠10081407
实验目的:实现多个系统调用实验
实验内容:添加简单系统调用、添加随机抽牌系统调、用模块添加系统调用
实验步骤:
(我是将三个系统调用添加完毕后一起编译的)
1.在usr/src/linux-
2.4/include/asmi386/unistd.h
中添加#define__nR_print_info259和