linux系统调用实验报告.docx
- 文档编号:11942896
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:9
- 大小:21.11KB
linux系统调用实验报告.docx
《linux系统调用实验报告.docx》由会员分享,可在线阅读,更多相关《linux系统调用实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
linux系统调用实验报告
竭诚为您提供优质文档/双击可除
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("syscall(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和#define__nR_rank260
2.在usr/src/linux-2.4/arch/i386/kernel/entry.s中添加.longsYmboL_nAme(sys_print_info)和.longsYmboL_nAme(sys_rank);3.在usr/src/linux-2.4/kernel中添加
asmlinkageintsys_rank(intvalue,intsuit)
{
if(value==1)return(int)(4*13+suit);
elsereturn(int)(4*(value-1)+suit);
};和
asmlinkageintsys_print_info(inttestflag)
{
printk(KeRn_emeRg"Itsmysyscallfunction!
\n");
return0;
}
4.在usr/src/linux-2.4/kernel/ksyms中添加
#ifndef__mips__
expoRT_sYmboL(sys_call_table);
#endif
至此,三个实验的系统调用添加完毕下面开始编译内核。
5.makeclean
makemrproper
makeoldconfig
makedep
makebzImage
makemodules
makemodules_install
makeinstall
在添加系统调用时候一定要专心、仔细,否则在编译的时候会出现错误,改起来很麻烦!
!
6.重启Linux后,显示界面如下(没有改内核版本号)
7.进入新内核后不要忘了将#define__nR_print_info
260添加到中
8.然后编写三个测试程序分别测试新的系统调用结果如下图:
关于test_print_info
259和#define__nR_rank
关于
card
关于call和
test_call
实验总结:
本次实验的内容涉及到Linux的系统调用。
所谓系统调用,即操作系统为应用程序提供的与内核进行交互的一组接口。
通过此接口,用户态下的应用程序可以转化为内核态,同时调用相应的内核函数运行,从而可以实现应用程序和系统内核的交互。
通过三个实验对Linux的系统调用原理进行验证。
第一个实验是简单的系统调用的添加;第二个实验则是丰富了系统调用的功能,实现了一个抽牌的功能,而不仅仅是打印语句;第三个实验则是将编译内核改进成了内核模块的编译,这样在不重启调用编译后内核的前提下插入编译的系统调用内核模块,即可以调用新的系统功能。
对于这次实验,我觉得最大的困难在于如何编译内核。
开始的时候只知道makeclean和makedep,却在makebzImage的时候出现了一堆选项让选y/n/m,后来才知道只要打makeoldconfig按原来的配置就可以了。
然后是在makebzImage的时候出现了两个错误:
一个是字母打错了,一个是位置加错了。
又回去改,重新make。
makemodules花费的时间最长,之后还算很顺利,只不过重启之后系统又自动进入Redhat2.4.20-8我不知道,在执行test_print-info的时候显示i=-1,syscallfailed!
以为添加系统调用失败了!
!
后来才发现是进错了地方。
虽然对于这次实验,大多数内容都已经给出了,但是还是花了我很多时间。
过程很纠结,还好最后成功了!
最后,感谢老师在课上关于系统调用知识的讲解,有助于我对本次实验更好的理解。
篇三:
Linux系统调用实现机制实验报告-内核安装详解
Linux系统调用实现机制实验报告
实验目的:
熟悉Linux系统调用过程,掌握系统调用的基本原理并在实验中实现系统调用的添加。
实验所需软件:
实验平台:
Vmwareworkstation;
系统环境:
RedhatLinux9.0;
传输工具:
Ftpserver(servusetup);
实验过程:
一、实验环境的搭建
(一)在window下安装虚拟机Vmwareworkstation;
(二)在虚拟机上安装Redhat9.0系统;
(三)在window下安装Ftpserver,实现Linux与windows文件共享。
1.Ftp服务器的配置
打开Ftpserver,在[管理控制台]中选择[新建域],系统会弹出配置域向导的对话框,这里按要求填入相应信息,即可配置成功一个ftp服务器。
步骤1要求用户填入域的[名称]和[说明],[名称]必须填写,[说明]可以不填。
例如:
在名称中输入[Linux实验],选择[下一步],便进入到域向导的步骤2。
步骤2是服务器访问协议和端口的配置,默认即可,点击[下一步]进入步骤3。
步骤3是Ip地址的配置,输入windows主机的Ip地址(202.112.147.176)。
确认无误后,点击[完成]。
接下来要做的就是为域添加用户,根据添加用户向导,逐个填写[用户名],[密码],[根目录(即共享的文件目录)]以及[访问权限]。
本次实验的配置为:
tml(用户名),密码为空,e:
\安全操作系统\实验材料(存放config-2.4.18formp.txt和linux-2.4.18.tar.gz的目录),完全访问(访问权限)。
到此,服务器的配置已经完成。
2.在Linux下访问服务器,并下载文件
启动Vmware中的Redhat9.0系统,打开终端控制台,进入到/home/tml目录下(接下来就是要把Ftp服务器的共享文件下载到此目录下)。
1)通过命令ifconfig设置虚拟机Ip地址,具体为在命令行中输入:
ifconfigeth0202.112.147.175(与服务器同一个段);
2)接下来便可访问ftp服务器,在linux命令行下输入:
ftp202.112.147.176;
3)服务器询问你用户名和口令,分别输入tml(密码为空)待认证通过即可;
用get命令下载文件,getconfig-2.4.18formp.txtconfig-2.4.18formp.txt(下载文件config-2.4.18formp.txt到/home/tml目录),get
linux-2.4.18.tar.gzlinux-2.4.18.tar.gz。
以上完成了通过FTp服务器实现windows与Linux系统资源共享的工作,在Linux系统下获得了实验必备的原材料Linux-2.4.18.tar.gz和
config-2.4.18formp.txt,只是完成的实验的第一步。
二、Linux内核编译、配置与调试
以下的实验步骤都是在Vmwareworkstation虚拟机和RedhatLinuxV9.0系统操作环境中进行。
1.内核配置与编译
1)使用命令tarzxf解压缩Linux内核源代码压缩文件
linux-2.4.18.tar.gz,并将解压缩(:
linux系统调用实验报告)后生成的目录linux拷贝一份,并重新命名为linux-2.4.18(放在/home目录下)。
2)在/home目录下,利用命令mv/tml/config-2.4.18formp.txt
/linux-2.4.18/.config将位于Linux内核源代码顶层目录的Linux内核缺省配置文件.config替换为实验用内核配置文件。
3)进入Linux内核源代码顶层目录linux-2.4.18,运行如下命令序列配置和编译Linux系统内核及其模块:
2.内核安装与测试
为使虚拟机系统基于上面生成的Linux内核启动,需要做一下几件事:
将Linux内核映像文件bzImage(根文件系统);将系统映射文件system.map拷贝和安装到启动分区及目录/boot下;同时,应在系统启动加载程序gRub配置文件中添加关于该内核的启动配置项。
注意:
本步骤要求用户身份为超级管理员即根用户root,具体的操作如下:
1)将目录/home/linux-2.4.18/arch/i386/boot/下的映像文件拷贝到/boot
目录下,即在linux-2.4.18目录下执行命令:
2)拷贝和安装Linux系统映射文件system.map,并创建其与系统映射文件system.map之间的符号链接,在boot目录下执行以下命令:
3)修改系统启动加载程序配置文件grub.conf,在目录/boot/grub/下。
在配置文件中添加关于Linux2.4.18内核的启动配置项:
4)在Linux2.4.18目录下执行命令makemodules_install,安装可动态加载的内核模块。
安装的内容位于/lib/modules/2.4.18目录下。
5)执行命令reboot重启系统,并便可以选择自制Linux内核系统(如下图)。
6)接下来,便可执行命令dmesg查看启动过程输出信息,详细内容参见附录一。
三、Linux系统调用添加与实现
1.内核增加系统调用
1)根据题目要求,要在系统中增加一条系统调用,其作用是获取特定进程标识符
pID所对应的资源使用情况,包括用户态或内核态的执行时间(以秒和微秒为单位)、无需或需要物理输入输出操作的页面错误次数、进程置换出内存的次数等。
2)此系统调用是Linux内核系统调用getrusage()的一个变种,所以在添加之前先阅读和分析getrusage()及sys_getrusage()相关源代码,在目录/home/linux-2.4.18/linux/kernel下的sys.c文件中,详细见附录二。
3)题目为我们提供好了新添加系统调用的名称get_process_usage,其函数原型为:
4)根据题目条件,结构体structtml_rusage的可定义为:
.
2.分析getrusage()和sys_getrusage()的源代码
1)函数getrusage()的作用是获取系统资源使用情况。
2)数据结构rusage在头文件resource.h中定义,详见附录三。
3)sys_getrusage()只是调用了内核函数getrusage(),是内核提供给用户的接口。
3.新增系统调用并编写应用程序调用该系统
1)定义数据结构tml_rusage,定义在目录/home/linux-2.4.18/include/linux的resource.h中。
2)在添加sys.c中添加函数get_process_usage()和系统调用函数sys_get_process_usage()的代码;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 系统 调用 实验 报告