快速业务通道

Linux下增加系统调用的方法

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

  1.linux系统调用的基本原理

  linux的系统调用形式与POSIX兼容,也是一套C语言函数名的集合.然而,linux系统调用的内部实现方式却与DOC的INT 21H相似,它是经过INT 0X80H软中断进入后,再根据系统调用号分门别类地服务.

  从系统分析的角度,linux的系统调用涉及4个方面的问题.

  (1)与系统调用有关的数据结构和函数

  函数名以“sys_”开头,后跟该系统调用的名字.例如,系统调用fork()的响应函数是sys_fork()(见Kernel/fork.c),exit()的响应函数是sys_exit()(见kernel/fork.c).

  文件include/asm/unisted.h为每个系统调用规定了唯一的编号.假设用name表示系统调用的名称,那么系统调用号与系统调用响应函数的关系是:以系统调用号_NR_name作为下标,可找出系统调用表sys_call_table(见

  arch/i386/kernel/entry.S)中对应表项的内容,它正好 是该系统调用的响应函数sys_name的入口地址.系统调用表sys_call_table记录了各sys_name函数在表中的位 置,共190项.有了这张表,就很容易根据特定系统调用在表中的偏移量,找到对应的系统调用响应函数的入口地址.系统调用表共256项,余下的项是可供用户自己添加的系统调用空间.

  (2)进程的系统调用命令转换为INT 0x80中断的过程

  宏定义_syscallN()见include/asm/unisted.h)用于系统调用的格式转换和参数的传递.N取0~5之间的整数.参数个数为N的系统调用由_syscallN()负责格式转换和参数传递.系统调用号放入EAX寄存器,启动INT 0x80 后,规定返回值送EAX寄存器.

  (3)系统调用功能模块的初始化

  对系统调用的初始化也就是对INT 0x80的初始化.系统启动时,汇编子程序setup_idt(见arch/i386/kernel/head.S)准备了1张256项的idt表,由 start_kernel()(见 init/main.c),trap_init()(见

  arch/i386/kernel/traps.c)调用的C语言宏定义

  set_system_gate(0x80,&system_call)(见include/asm/system.h)设置0x80号软中断的服务程序为 system_call(见

  arch/i386/kernel/entry.S),system.call就是所有系统调用的总入口.

  (4)内核如何为各种系统调用服务

  当进程需要进行系统调用时,以C语言函数的形式写一句系统调用命令.该命令如果已在某个头文件中由相应的_syscallN()展开,则用户程序包含该文 件.当进程执行到用户程序的系统调用命令时,实际上执行了由宏命令_syscallN()展开的函数.系统调用的参数 由各通用寄存器传递,然后执行INT 0x80,以内核态进入入口地址system_call.

Empire CMS,phome.net

  (5)ret_from_sys_call

  以ret_from_sys_call入口的汇编程序段在linux进程管理中起到了十分重要的作用.所有系统调用结束前以及大部分中断服务返回前,都会跳转至此处入口地址. 该段程序不仅仅为系统调用服务,它还处理中断嵌套、CPU调度、信号等事务.

  2.通过修改内核源代码添加系统调用

  通过以上分析linux系统调用的过程,将自己的系统调用加到内核中就是一件容易的事情.下面介绍一个实际的系统调用,并把它加到内核中去.要增加的系统调用是:inttestsyscall(),其功能是在控制终端屏幕上显示hello world,执行成功后返回0.

  1编写inttestsyscall()系统调用

  编写一个系统调用意味着要给内核增加1个函数,将新函数放入文件kernel/sys.c中.新函数代码如下:

  asmlingkage sys_testsyscall()

  { console_print("hello worldn");

  return 0;

  }

  2连接新的系统调用

  编写了新的系统调用过程后,下一项任务是使内核的其余部分知道这一程序的存在,然后重建包含新的系统调用的内核.为了把新的函数连接到已有的内核中去, 需要编辑2个文件:

  1).inculde/asm/unistd.h在这个文件中加入

  #define_NR_testsys

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号