详细介绍创建并使用一个系统调用

来源:互联网 发布:阿里云服务器能干嘛 编辑:程序博客网 时间:2024/06/04 23:27

前提:

操作系统是centos6.5,编译的内核版本为2.6.32.61,编译linux内核过程详见本博客http://blog.csdn.net/supenman_mwg/article/details/25836547


1、修改内核文件unistd_32.h

cd  /home/linux-2.6.32.61/ arch/x86/include/asm

vim unistd_32.h

要添加的内容如下所示,

注意相应的位置。最好按照系统调用号的从小到大的顺序来放。

#define __NR_mwg_hello          337

修改完了之后,保存退出。

这里是我自己添加的代码,大家可以把mwg_hello换成任意字符;

下面是我自己修改代码的截图


2、修改内核文件syscall_table_32.S

cd  /home/linux-2.6.32.61/ arch/x86/kernel

vim syscall_table_32.S

在文件的末尾添加

.long sys_mwg_hello

sys_后面的字符要和unistd_32.h中__NR_后面的字符相对应,我这里都是mwg_hello

下面是我修改文件的截图


3、修改内核文件sys_i386_32.c

cd  /home/linux-2.6.32.61/ arch/x86/kernel

vim sys_i386_32.c

在文件的末尾添加系统调用函数

asmlinkage long sys_mwg_hello(void)
{
        printk("mwg's first system call!\n");


        return 0x5211314;
}


4、编译内核文件syscalls.h

在syscalls.h文件中添加声明

asmlinkage long sys_mwg_hello(void);


5、编译内核

修改完文件之后,编译内核并安装 详见http://blog.csdn.net/supenman_mwg/article/details/25836547


6、编写用户空间程序进行测试

我写的测试文件如下:

#include <stdio.h>
#include <sys/syscall.h>
#include <linux/unistd.h>
#define __NR_mwg_hello 337

int main()
{
        int loveNum;
        loveNum=syscall(__NR_mwg_hello);
        
        printf("Love num is %x\n",loveNum);

        return 0;
}

编译并运行

gcc -o mwg_hello mwg_hello.c

sudo ./mwg_hello

测试结果

Love num is 5211314

在终端下输入命令

dmesg                              //dmesg打印内核消息

显示结果如图



0 0
原创粉丝点击