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

前提:

操作系统是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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值