基于Linux操作系统的系统调用分析.pdf
《基于Linux操作系统的系统调用分析.pdf》由会员分享,可在线阅读,更多相关《基于Linux操作系统的系统调用分析.pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1 0 卷第6 期重庆科技学院学报(自然科学版)2 0 0 8 年1 2 月基于L i nu x 操作系统的系统调用分析范恩魁陈亚军(西华师范大学,南充6 3 7 0 0 0)摘要:L i n u x 操作系统具有源码的开放性和极强的稳定性等优点。基于L i n u x 一2 4 内核,分析了系统调用的实现原理和过程讨论了用户增加新的系统功能调用的实现方法。关键词:系统调用:L i n u x;内核中图分类号:T P 3 1 6文献标识码:A文章编号:1 6 7 3 1 9 8 0(2 0 0 8)0 6 0 1 2 4 0 3系统调用是指操作系统内核提供给应用程序调用的一系列函数(也可称为
2、一组特殊接I=I),功能十分强大应用程序通过这些函数来获得操作系统提供的有关设备管理、进程控制、进程问通信等一系列的功能而不必了解系统的内部结构。从而起到减轻用户负担、保护系统以及提高资源利用率的作用。作为开源软件的代表L i n u x 操作系统以其源码的开放性、极强的稳定性,适用于多种计算机平台、且由全世界各地数以百计的程序员设计和维护。最近数年得到了广泛的应用。它的系统调用不同于其他操作系统:在给用户程序提供服务的同时还对内核安全提供了保障使用户程序不能随意修改系统调用。文中分析了L i n u x 系统调用的具体过程以及在有L i n u x 源代码的情况下,通过一个简单实例说明如何添
3、加适合用户自己的系统调用的方法。1L i n u x 的系统调用分析在L i n u x 系统中程序的运行空间分为内核空间和用户空间f 常称的内核态和用户态在用户空间运行应用程序),它们分别运行在不同的级别上,在逻辑上是相互隔离的。用户进程通常不允许访问内核,当用户进程需要获得一定的系统服务(调用内核空间的程序)时,这时就须用到系统调用。系统调用规定用户进程进入内核空间的具体位置然后程序运行空间从用户态进入内核态完成相关处理处理完后再返回到用户态。L i n u x 系统调用是作为一种异常类型实现的,它通过执行相应的机器代码来产生异常信号,然后自动将系统切换为内核态并执行相应的处理程序。用户态
4、的程序可以通过两种不同的方式实现系统调用:(1)执行i n t$o)(8 0 汇编语言指令,在L i n u x 一2 4 及以前的版本中,这是从用户态切换到内核态的唯一方式;(2)执行s y s e n t e r 汇编指令,在I n t e lP e n t i u m I I 微处理器芯片中引入了这条指令。现仅L i n u x 一2 6 版本中支持这条指令。系统调用完成后,系统执行i r e t 汇编指令或s y s e x i t 汇编指令(L i n u x 一2 6 版本中支持)将系统返回到用户态,控制权还交给用户进程。因为支持进入或退出L i n u x 内核的这两种方式须满足
5、如下条件:(1)内核必须既支持只使用i n t$0 x 8 0 指令的1 日函数库同时也支持使用s y s e n t e r 指令的新函数库;(2)使用s y s e n t e r 指令的标准库必须能处理仅支持i n t$0)【8 0 指令的旧内核;(3)内核和标准库必须既能运行在不包含s y s e n t e r 指令的旧处理器上。也能运行在包含它的新处理器上。所以接下来的分析都是基于L i n u x 一2 4 2 0 版本进行。1 1 调用结构和函数L i n u x 的系统调用是一套C 语言甬数名的集合,如w r i t e 0、o p e n 0、r e a d 0 等,共2
6、5 8 个(R e dH a tL i n u x 一2 4 2 0)。为了实现系统调用的功能,在L i n u x内核定义了相关的数据结构和函数。当产生系统调用时通过i n t$O x 8 0 指令进人系统调用总入E l(s y s t e m _ c a l l),在入口处保存寄存器当收稿日期:2 0 0 8-0 8 1 5基金项目:四川省教育厅重大科研培育项目(0 7 Z Z 0 3 5)作者简介:范恩魁(1 9 8 3 一),男,四川遂宁人,西华师范大学计算机学院硕士研究生,研究方向:嵌入式系统开发。1 2 4-万方数据范恩魁陈亚军:基于L i n u x 操作系统的系统调用分析前值。
7、检验当前调用是否合法以及根据系统调用表_ s y s _ c a l l _ t a b l e 和E A X 的系统调用号找到并转入系统调用的响应函数,从响应函数返回后让E A X 寄存器保存函数返回值,跳转至r e t _ f r o m _ s y s _ c a l l,最后均从r e s t o r e _ a l l 返回到用户空间。系统调用总人口和系统调用表在文件u s r s r c l i n u x 一2 4 a r e l d i 3 8 6 k e r n e l e n t r y S 中进行了定义。系统调用表依次保存着所有系统调用的函数指针,通过这张表就可以根据特定
8、系统调用在表中的偏移量找到对应的系统调用响应函数的人口地址,其部分代码如下:E N T R Y(s y s _ c a l l t a b l e)1 0 n gS Y M B O L N A M E(s y s _ n i _ s y s c a l l)1 0 n gS Y M 8 0 L _ N A M E(s y s _ e x i 01 0 n gS Y M B O L N A M E(s y s _ s e tt i da d d r e s s)r e p tN R _ s y s c a l l s 一(一s y s _ c a l l t a b l e)41 0 n gS
9、Y M B O L _ N A M E(s y s _ n i s y s c a l l)e n d rL i n u x 在文件u s r s r c l i n u x 一2 4 i n c l u d e a s m i 3 8 6 u n i s t d h 中为每个系统调用规定了唯一的系统调用号,通过系统调用号可以找到系统调用表中对应表项的内容,它正好就是该系统调用响应函数的入口地址。其定义形式如下所示:#d e f i n e N R e x i tl#d e f i n e N Rf o r k2#d e f i n e N R s e t _ t i d _ a d d r
10、e s s2 5 8L i n u x 中的系统响应函数的函数名约定以“s y s _”开头,后跟该系统调用的名字,构成2 5 8 个形如s y s _ _ n a m e 0 的函数名。如w r i t e O 的响应函数为s y s _ w r i t e 0。响应函数在u s r s r c l i n u x 一2 4 K e m e l s y s e 中实现,函数格式为:A s m l i n k a g e 函数返回类型s y s _ 函数名(参数列表)函数内容1 2 参数的传递L i n u x 系统调用的参数通过标准C 库把待传参数装载到C P U 的寄存器中,然后触发O x
11、 8 0 中断进入内核态,在内核态对参数进行相关处理返回时又把返回值放入寄存器,把控制权交给用户程序,从寄存器中取出返回值。与参数传递相关的宏在内核文件u s r s r e l i n u x 一2 4 i n c l u d e a s m i 3 8 6 u n i s t d h 中进行了定义,共7 个。即:_ s y s c a l l N 0,N 取0-6 的任意数。通过这些宏可以实现系统调用的格式转换和参数的传递,其定义格式如下:#d e f i n e s y s e a l l N(t y p e,n a m e,t y p e l,a r g l,t y p e N,a r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Linux 操作系统 系统 调用 分析
限制150内