欢迎来到天天文库
浏览记录
ID:33971593
大小:56.30 KB
页数:4页
时间:2019-03-02
《实验一操作系统的系统调用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验一:系统调用概述通常来说,我们不需要直接访问Linux内核屮的系统调用,而使用C函数库里面的代码,不过有时候我们会发现标准C函数库里而的函数并不能很好的满足我们的需要,而某个内核系统调用正好是我们所需的,那我们还是应该毫不犹豫的去调用它的。系统调用函数通常由用户进程在用户态下调用,内核通过system_call函数响应系统调用产生的软中断,在正确访问核心栈、系统调用开关表之后陷入到操作系统内核中进行处理。系统调用是用户进程由用户态切换到核心态的一种常见方式。编写系统调用函数可以直接调用了部分操作系统内核代码,。使用需要包含的头文件如下:#include2、>宏_syscall和其他函数调用一样,对于一个系统调用我们首先要知道的是它的原型。你必须知道它有多少调用参数,每个参数的类型,还有相关函数返冋值得类型等。_syscallX(type,name,typeI,argl,type2,arg2,...)其中:X是0-5,实际上它指出了该系统调用会有多少个参数。type该系统调用返回的类型name该系统调用的名字typeN第N个参数的类型argN第N个参数的名字这些宏创建一个名字为“name”的函数,这个函数的参数就是由你指定的。一旦你包含了_syscall()在你的源代码里面,你就可以用“name”來访问这个系统调用了。#include3、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/free8273925、/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/kem7、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_
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_
此文档下载收益归作者所有