当前位置:七道奇文章资讯系统安全Linux安全
日期:2011-01-23 03:26:00  来源:本站整理

<b>linux下增添系统调用</b>[Linux安全]

赞助商链接



  本文“<b>linux下增添系统调用</b>[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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.

(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 world\n");

return 0;

}

2衔接新的系统调用

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

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

#define_NR_testsyscall 191

2).are/i386/kernel/entry.s这个文件用来对指针数组初始化,在这个文件中增添一行:

.long SYMBOL_NAME(_sys_tsetsycall)

将.rept NR_syscalls-190改成NR_SYSCALLS-191,然后重新嘉奖和运行新内核.

3).利用新的系统调用   在保证的C语言库中没有新的系统调用的程序段,必须自己成立其代码以下

#inculde

_syscall0(int,testsyscall)

main()

{

tsetsyscall();

}

在这里利用了_syscall0()宏指令,宏指令本身在程序中将扩大成名为syscall()的函数,它在main()函数内部加以调用.

在testsyscall()函数中, 预处理程序产生全部必要的机械指令代码,包含用系统调用参数值加载呼应的cpu存放器, 然后履行int

0x80中止指令.

3.操纵内核模块增添系统调用

模块是内核的一部份,但是并没有被编译到内核里面去.它们被辨别编译并衔接成一组目标文件, 这些文件能被插入到正在运行的内核,大概从正在运行的内核中移走.内核模块至少必须有2个函数:

int_module和cleanup_module.第一个函数是在把模块插入内核时调用的;

第二个函数则在删除该模块时调用.由于内核模块是内核的一部份,所以能拜候全部内核资源.按照对linux系统调用机制的解析,

假如要增添系统调用,可以编写自己的函数来实现,然后在sys_call_table表中增添一项,使该项中的指针指向自己编写的函数,

便可以实现系统调用.下面用该办法实目前掌握终端上打印“hello world” 的系统调用testsyscall().

1)编写系统调用内核模块

#inculde(linux/kernel.h)

#inculde(linux/module.h)

#inculde(linux/modversions.h)

#inculde(linux/sched.h)

#inculde(asm/uaccess.h)

#define_NR_testsyscall 191

extern viod *sys_call+table[];

asmlinkage int testsyscall()

{ printf("hello world\n");

return 0;

}

int init_module()

{ sys_call_table[_NR_tsetsyscall]=testsyscall;

printf("system call testsyscall() loaded success\n");

return 0;

}

void cleanup_module()

{

}

2)利用新的系统调用#define

#define_NR_testsyscall 191

_syscall0(int,testsyscall)

main()

{

testsyscall();

}

3)编译内核模块并插入内核

编译内核的号令为:gcc -Wall -02 -DMODULE -D_KERNEL_-C syscall.c

-Wall告诉编译程序显示告诫信息;参数-02 是关于代码优化的设置, 内核模块必须优化;

参数-D_LERNEL告诉头文件向内核模块供应精确的定义; 参数-D_KERNEL_告诉头文件,

这个程序代码将在内核情势下运行.编译成功后将生成 syscall.0文件.最后利用insmod

syscall.o号令将模块插入内核后便可以利用增添的系统调用.

对比以上二种办法,笔者认为采取内核模块的办法较好.因为这种办法可省去编译新内核并用新内核重新 启动的麻烦,这一长处关于代码的调试是非常有代价的, 可以节俭大量时间.   以上是“<b>linux下增添系统调用</b>[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .