linux系统调用实验报告篇一:linux系统调用实验报告专业名称:软件工程中学生姓名:学号(8指导班主任:XX**X实验日期:2016系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,例如用户可以通过文件系统相关的调用恳求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的插口——它好比一个中间人,把用户进程的恳求传达给内核,待内核把恳求处理完毕后再将处理结果送回给用户空间。控制硬件——系统调用常常作为硬件资源和用户空间的具象插口,例如读写文件时用到的write/read调用。设置系统状态或读取内核数据——因为系统调用是用户空间和内核的置某个内核变量),或读取内核数据都必须通过系统调用。例如getpgid、getpriority、setpriority、sethostname进程管理——一系统调用插口是拿来保证系统中进程能以多任务在虚拟显存环境下得以运行。例如fork、clone、execve、exit第二,哪些服务应当存在于内核;或则说哪些功能应当实现在内核而不是在用户空间。
这个问题并没有明晰的答案,有些服务你可以选择在内核完成,也可以在用户空间完成。选择在内核完成一般基于以下考虑:服务必须获得内核数据,例如一些服务必须获得中断或系统时间等内从安全角度考虑,在内核中提供的服务相比用户空间提供的毫无疑惑从效率考虑,在内核实现服务避开了和用户空间来回传递数据以及保护现场等步骤,因而效率常常要比在用户空间实现高许多。例如,httpd等服务。假如内核和用户空间都须要使用该服务,这么最好实现在内核空间,2)KDB使用将其编译成名为getpid的执行文件“gccgetpid路径/getpid.c”,使用KDB来产看它步入内核后的执行路径。1、激活KDB(按下pause键,其实你必须早已给内核打了KDB补丁);设置内核断点“bpsys_getpid”;退出kdb“go”;之后执行./getpid。顿时,步入内核调试状态,执行路径停止在断点sys_getpid2、在KDB提示符下,执行bt命令观察堆栈,发觉调用的嵌套路径,可以看见在sys_getpid是在内核函数system_call中被嵌套调用的。3、在KDB提示符下,执行rd命令查看寄存器中的数值,可以看见eax中储存的getpid调用号——0x00000014(=20).4、在KDB提示符下,执行ssb(或ss)命令跟踪内核代码执行路径,可以发觉sys_getpid执行后linux内核实验报告linux内核实验报告,会返回system_call函数,之后接者转到ret_from_sys_call类库。
(再往前还有些和调度有关其他类库,我们这儿不说了它们了。)1、该程序调用libc库的封装函数getpid。该封装函数将系统调用号_NR_getpid(第20个)压入EAX寄存器,2、调用软中断intint00xx8080步入内核。3、在内核中首先执行system_call,接着执行依据系统调用号在调用表中查找到的对应的系统调用服务类库sys_getpid。4、执行sys_getpid服务类库。5、执行完毕后,转到syscall_exit_work类库,系统调用中返回。正常测试数据(3组)及运行结果;系统调用是一层用户步入内核的插口,内核公开的内核函数——export下来的——可以使用命令ksymscat/proc/ksyms#includestdio.h#includesyscall.h2)/*跟踪系统调用*/#includeunistd.h#includesys/types.h#includestdio.hintmain(void)#includesyscall.h#includeunistd.hlongID1,ID2;#includesys/types.h/*直接调用内核函数*/intmain(void)ID1=syscall(SYS_getpid);printf("syscall(SYS_getpid)=%ldnlongID;,ID1);ID=getpid();printf("getpid()=%ldn",ID);ID2=getpid();篇二:操作系统实验报告Linux下的系统调用Linux下的系统调用实验内容:添加简单系统调用、添加随机抽牌系统调、用模块添加系统调用usr/src/linux-2.4/include/asmi386/unistd.h中添加#define__NR_print_info259和#define__NR_rank260.longSYMBOL_NAME(sys_print_info)和.longSYMBOL_NAME(sys_rank);3.在usr/src/linux-2.4/kernel中添加asmlinkageintsys_rank(intvalue,intsuit)(value==1)return(int)(4*13+suit);elsereturn(int)(4*(value-1)+suit);asmlinkageintsys_print_info(inttestflag)printk(KERN_EMERGIt'smysyscallfunction!n");4.在usr/src/linux-2.4/kernel/ksyms中添加#ifndef__mips__5.makecleanmakemrpropermakeoldconfigmakedepmakebzImagemakemodulesmakemodules_installmakeinstall在添加系统调用时侯一定要专心、仔细linux 论坛,否则在编译的时侯会出现错误,改上去很麻烦!!6.重启Linux后,显示界面如下(没有改内核版本号)7.步入新内核后不要忘了将#define__NR_print_info260添加到中259和#define__NR_rank本次实验的内容涉及到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系统调用实现机制实验报告熟悉Linux系统调用过程,把握系统调用的基本原理并在实验中实现系统调用的添加。实验平台:VMwareWorkStation;系统环境:RedHatLinux9.0;传输工具:Ftpserver(ServUSetup);