给Linux内核增加一个系统调用的方法(转)

时间:2021-02-21 16:50:42

作者:chenjieb520

Linux内核增加一个系统调用的方法

   为了更加好地调试linux内核,笔者的实验均在mini6410的arm板上运行的。这样做的原因,第一是因为本人是学嵌入式的,第二是这样可以在arm板上进行实验,可以提高实验的效率。

(1)、首先定义你所要添加的系统调用名,然后在Linux-2.6.x/kernel/创建一个文件,文件名为:mysyscall.c文件的内容为:

给Linux内核增加一个系统调用的方法(转)

(2)、在Linux-2.6.x/arch/x86/include/asm/unistd_32.h中为系统调用定义一个索引号,这个索引号必须在索引列表的最后一个的后面。

给Linux内核增加一个系统调用的方法(转)

(3)、在unistd_32.h中同时添加了系统调用的个数

#define __NR_syscalls 295   //add by chenjieb

给Linux内核增加一个系统调用的方法(转)

(4)、在Linux-2.6.x/arch/x86/kernel/syscall_table.S,这个表按系统调用号(即前面提到的__NR_name)排列了所有系统调用函数的指针,以供系统调用入口函数查找。从这张表看得出,linux给它所支持的系统调用函数取名叫sys_name。

.long sys_mysyscall

给Linux内核增加一个系统调用的方法(转)

(5)、在Linux-2.6.x/kernel/Makefile中添加如下的语句,这是用于内核的编译使用的。

obj-y += mysyscall.o

给Linux内核增加一个系统调用的方法(转)

(6)、写一个测试的程序。测试上述的西系统调用是否可以用。

#include <errno.h>
 #include <sys/syscall.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
long errno_one;
#define __NR_mysyscall 294
int main() 
{
errno_one=mysyscall(12,24);
printf("%d\n",errno_one);
return 0;

}

运行结果:首先先对增加了新的系统调用的内核进行编译,将编译后的内核下载到arm板上,然后编译自己的测试程序。

1、编译内核结果如下:

给Linux内核增加一个系统调用的方法(转)

2、运行的结果:如果在自己的PC板上运行的话,需要超级用户,而我是在arm板上运行,arm板上的系统默认是超级用户,所以我这里只需要一般的运行即可,结果如下:

给Linux内核增加一个系统调用的方法(转)

希望这个教程对大家学习Linux内核有用!欢迎大家批评指教!

http://blog.csdn.net/chenjieb520/article/details/7317629