置顶linux系统调用

置顶linux系统调用

ID:30444106

大小:86.63 KB

页数:16页

时间:2018-12-30

置顶linux系统调用_第1页
置顶linux系统调用_第2页
置顶linux系统调用_第3页
置顶linux系统调用_第4页
置顶linux系统调用_第5页
资源描述:

《置顶linux系统调用》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、置顶linux系统调用5.1.5如何使用系统调用如图5.2所示,用户应用可以通过两种方式使用系统调用。第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。第二种方式是使用_syscall宏。2.6.18版本之前的内核,在include/asm-i386/unistd.h文件中定义有7个_syscall宏,分别是:其中,type表示所天生系统调用的返回值类型,name表示该系统调用的名称,typeN、argN分别表示第N个参数的类型和名称,它们的数目和_syscall后面的数字一样大。这些宏的作用是创建名为name的函数,_syscall后面跟的数字指明了该函

2、数的参数的个数。比如sysinfo系统调用用于获取系统总体统计信息,使用_syscall宏定义为:展开后的形式为:可以看出,_syscall1(int,sysinfo,structsysinfo*,info)展开成一个名为sysinfo的函数,原参数int就是函数的返回类型,原参数structsysinfo*和info分别构成新函数的参数。在程序文件里使用_syscall宏定义需要的系统调用,就可以在接下来的代码中通过系统调用名称直接调用该系统调用。下面是一个使用sysinfo系统调用的实例。代码清单5.1sysinfo系统调用使用实例00#includestdio.h01#i

3、ncludestdlib.h02#includeerrno.h03#includelinux/unistd.h04#includelinux/kernel.h0506_syscall1(int,sysinfo,structsysinfo*,info);0708intmain(void)09{10structsysinfos_info;11interror;1213error=sysinfo(&s_info);14printf("codeerror=%d",error);15printf("Uptime=%ldsLoad:1min%lu/5min%lu/15min%lu

4、n"16"RAM:total%lu/free%lu/shared%lu"17"Memoryinbuffers=%luSwap:total%lu/free%lu"18"Numberofprocesses=%d",19s_info.uptime,s_info.loads[0],20s_info.loads[1],s_info.loads[2],21s_info.totalram,s_info.freeram,22s_info.sharedram,s_info.bufferram,23s_info.totalswap,s_info.freeswap,24s_info.

5、procs);25exit(EXIT_SUCCESS);26}但是自2.6.19版本开始,_syscall宏被废除,我们需要使用syscall函数,通过指定系统调用号和一组参数来调用系统调用。syscall函数原型为:其中number是系统调用号,number后面应顺序接上该系统调用的所有参数。下面是gettid系统调用的调用实例。代码清单5.2gettid系统调用使用实例大部分系统调用都包括了一个SYS_符号常量来指定自己到系统调用号的映射,因此上面第10行可重写为:5.2系统调用执行过程系统调用的执行过程主要包括如图5.3与图5.4所示的两个阶段:用户空间到内核空间的转换阶

6、段,以及系统调用处理程序system_call函数到系统调用服务例程的阶段。(1)用户空间到内核空间。如图5.3所示,系统调用的执行需要一个用户空间到内核空间的状态转换,不同的平台具有不同的指令可以完成这种转换,这种指令也被称作操纵系统陷进(operatingsystemtrap)指令。Linux通过软中断来实现这种陷进,具体对于X86架构来说,是软中断0x80,也即int[message]x80汇编指令。软中断和我们常说的中断(硬件中断)不同之处在于-它由软件指令触发而并非由硬件外设引发。int0x80指令被封装在C库中,对于用户应用来说,基于可移植性的考虑,不应该直接调用i

7、nt[message]x80指令。陷进指令的平台依靠性,也正是系统调用需要在C库进行封装的原因之一。通过软中断0x80,系统会跳转到一个预设的内核空间地址,它指向了系统调用处理程序(不要和系统调用服务例程相混淆),即在arch/i386/kernel/entry.S文件中使用汇编语言编写的system_call函数。(2)system_call函数到系统调用服务例程。很显然,所有的系统调用都会同一跳转到这个地址进而执行system_call函数,但正如前面所述,到2.6.23?*梗诤颂峁┑南

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

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

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