快速业务通道

linux采用编译内核的方法增加系统功能调用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-07

最近做了我们院的操作系统课程设计,本来是想把我的报告拿出来和大家分享的,可寝室的朋友说我这么做容易使后来的童鞋不经过自己的思考就全盘copy,我决定还是分类讲讲我做的过程吧!完成的是一个linux系统功能调用的增加.

我们都知道系统功能调用是Unix/Linux操作系统向用户程序提供支持的接口,通过这些接口应用程序向操作系统请求服务,控制转向操作系统,而操作系统在完成服务后,将控制和结果返回给用户程序.

系统调用的主要目的是用户可以使用操作系统提供的有关设备管理、输入/输出系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用.

在进行系统功能调用时会由用户态(也称目态)转到核态(也称管态).昨天我的一信安的朋友还问过我管态和目态的区别,我想来想去也就是这里有大的区别了,在管态下能使用系统的所有资源,调用系统的特权函数,而目态是不行的.在执行系统功能调用时就是在管态下执行.

而如果我需要给我的linux系统增加一个系统功能调用的话,就弄清楚系统是如何调用那些功能函数的,又是如何由目态变为管态的.在linux下可以通过中断来进入管态,这类中断称为访管中断.

  • 内核中系统调用的过程

在Linux系统中,系统调用是作为一种异常类型实现的,它将执行相应的机器代码指令来产生异常信号.产生中断或异常的重要效果是系统自动将用户态切换为核心态来对它进行处理.

用户态的程序只有通过门(gate)陷入(trap)到系统内核中去(执行int指令),才能执行一些具有特权的内核函数.系统调用完成后,系统执行另一组特征指令(iret指令)将系统返回到用户态,控制权返回给进程.

Empire CMS,phome.net

Linux用来实现系统调用异常的实际指令是:

int $0x80

这一指令使用中断/异常向量号128(即16进制的80)将控制权转移给内核(进行模式切换).

为达到在使用系统调用时不必用机器指令编程,在标准的C语言库中为每一系统调用提供了一段短的子程序,完成机器代码的编程工作.

事实上,机器代码段非常简短.它所要做的工作只是将送给系统调用的参数加载到CPU寄存器中,接着执行int $0x80指令.然后运行系统调用.

系统调用的返回值将送入CPU的一个寄存器中,标准的库子程序取得这一返回值,并将它送回用户程序.

下面以getuid()系统调用为例来看调用过程:

我们可以看到其中有一些宏定义,我们可以看看这些宏的定义

(arch/i386/kernel/ entry.S).

………

#define SAVE_ALL

cld;

pushl %es;

pushl %ds;

pushl

Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号