linux内核4.2.x实现自定义系统调用

来源:互联网 发布:vb中cancel是什么意思 编辑:程序博客网 时间:2024/06/06 00:59

前言:

内核2.xx | 3.xx | 4.xx在添加系统调用时,需要的步骤大体相同。但是由于内核版本的变动,有些步骤的做法发生改变。网上的教程多是关于2.xx | 3.xx版本的。有些地方在4.xx版本上不相符。以下内容均以4.2.1版本为例子,基于Ubuntu虚拟机,64位PC。


首先,给出几个关键的路径:

/usr/src/linux-4.2.1/arch/x86/include/asma/sysclls.h                自定义的系统调用函数声明

/usr/src/linux-4.2.1/kernel/sys.c                                                     自定义的系统调用函数实现

/usr/src/linux-4.2.1/arch/x86/entry/syscalls/syscall_32.tbl       系统调用表


接下来,介绍以下添加系统调用的步骤:

1、在sysclls.h文件内定义函数声明:

asmlinkage long sys_hello(long t);            返回值、参数和正常定义函数一样,函数名一定要以sys_开头

asmlinkage不要缺少函数定义前加宏asmlinkage ,表示这些函数通过堆栈而不是通过寄存器传递参数。


2、在sys.c内实现上面声明的函数:

asmlinkage long sys_hello(long t)

{

                   return t;                        实现自己需要的功能

}

3、在syscall_32.tbl 内为上面的函数分配一个调用编号:

359 i386 hello sys_hello                     单独占一行


然后,介绍编译的步骤:

1、执行sudo apt-get installlibncurses5-dev , 这一步是为了make menuconfig的正确执行。如果这步遇见其它问题,不在本文讨论之列。

2、执行make menuconfig,不做任何修改,保存退出即可。

3、执行make modules,这步非常耗时间。

4、执行make modules_install.

5、执行make install

6、重启。


最后,编写测试程序:

#include <stdio.h>

int main()

{

           long t = syscall(359,888); // 359为syscall_32.tbl 内的调用编号 888为参数

           printf("t = %ld\n",t);

           return 0;

}

0 0
原创粉丝点击