实验一操作系统的系统调用

实验一操作系统的系统调用

ID:33971593

大小:56.30 KB

页数:4页

时间:2019-03-02

实验一操作系统的系统调用_第1页
实验一操作系统的系统调用_第2页
实验一操作系统的系统调用_第3页
实验一操作系统的系统调用_第4页
资源描述:

《实验一操作系统的系统调用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、实验一:系统调用概述通常来说,我们不需要直接访问Linux内核屮的系统调用,而使用C函数库里面的代码,不过有时候我们会发现标准C函数库里而的函数并不能很好的满足我们的需要,而某个内核系统调用正好是我们所需的,那我们还是应该毫不犹豫的去调用它的。系统调用函数通常由用户进程在用户态下调用,内核通过system_call函数响应系统调用产生的软中断,在正确访问核心栈、系统调用开关表之后陷入到操作系统内核中进行处理。系统调用是用户进程由用户态切换到核心态的一种常见方式。编写系统调用函数可以直接调用了部分操作系统内核代码,。使用需要包含的头文件如下:#include

2、>宏_syscall和其他函数调用一样,对于一个系统调用我们首先要知道的是它的原型。你必须知道它有多少调用参数,每个参数的类型,还有相关函数返冋值得类型等。_syscallX(type,name,typeI,argl,type2,arg2,...)其中:X是0-5,实际上它指出了该系统调用会有多少个参数。type该系统调用返回的类型name该系统调用的名字typeN第N个参数的类型argN第N个参数的名字这些宏创建一个名字为“name”的函数,这个函数的参数就是由你指定的。一旦你包含了_syscall()在你的源代码里面,你就可以用“name”來访问这个系统调用了。#include

3、tdio.h>#includeexterninterrno;_syscall1(int,sysinfo,structsysinfo,s_info)main(){structsysinfos_info;error=sysinfo(&s_info);printf(44codeerror=%d”,error);printf(<4Uptime=%dsLoad:1min%d/5min%d/15min%d^^“RAM:total%d/free%d/shared%d"uMemoryinbuffers=%dSwap:total%d/free%d^

4、^uNumberofprocesses=%d",s」nfo.uptime,s」nfo」oads10J,s_info」oads[1],s_info」oads[2],s_info.totalram,s_info.freeram,s_info.sharedram,s_info-bufferram,s」nfo.totalswap,s_info.freeswap,s_info.procs);return(O);}例子的输出:codeerror=0叩time=502034sLoad:1min13376/5min5504/15min1152RAM:total15343616/free827392

5、/shared8237056Memoryinbuffers=5066752Swap:total27881472/free24698880Numberofprocesses=40注意syscallO这个宏不牛成过程的调用原型,所以你要自己创建原型。你还需要仔细阅读源代码看看系统调用返冋的值的意义。通常,返冋的值是一个标准的错误代码,例如-EPERMo_syscall()这个宏返回系统调用的返回值r(如果1•是非负数),但是如果i•是负数,_syscall()则返回”・1”,而将全局变量errno设置为小某些系统调用,例如mmap,需要超过了5个参数,通常这些参数是被压入一个堆栈中,然后将

6、这个参数对应的堆栈的指针传过去。但定义一个系统调用的时候,参数的类型这个参数必须是传一个值或者指针(例如结构体)。添加系统调用编写系统调用函数编辑sys.c文件:#cd/usr/src/linux/kernel#visys.c在文件的最后增加一个系统调用函数:asmlinkageintsys_print_info(inttestflag){printk("Itsmysyscallfunctionin'');return0;}该函数有一个int型入口参数testflag,并返回整数0。修改与系统调用号相关的文件编辑入口表文件:#cd/usr/src/linux/arch/i386/kem

7、el#vientry.S把函数的入口地址加到sys_call_table表(系统调用的跳转表)中:arch/i386/kerneI/entry.S屮的最后儿行源代码修改前为:.longSYMBOL_NAME(sys_sendfile)JongSYMBOL_NAM^sys_ni_syscall)/*streams1*/.longSYMBOL_NAME(sys_ni_syscall)/*streams2*/.longSYMBOL_NAME(sys_

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

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

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