`
cloudtech
  • 浏览: 4614585 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

新版Linux内核添加系统调用的方法

 
阅读更多

新版Linux内核添加系统调用的方法


今天做Linux内核的作业,要自己动手添加一个系统调用。在网上搜了很多帖子,都是真的2.6版本的,我下载的版本是3.2.11,发现新版的内核添加方法非常不同,旧的方法已经不再使用,于是记下方法,仅供参考。

第一步

在linux-3.2.11/kernel下创建mysyscall.c文件,内容如下:

#include <linux/kernel.h>

asmlinkage long sys_mysyscall(void){
        printk(KERN_ALERT "This is my sys call!\n");
        return 0;
}       

第二步

在linux-3.2.11/kernel/Makefile中加入:

obj-y += mysyscall.o

第三步

在linux-3.2.11/include/linux/syscalls.h中加入:

asmlinkage long sys_mysyscall(void);

第四步

在linux-3.2.11/arch/x86/kernel/syscall_table_32.S(如果你编译的是64位机器则32替换为64)中加入:

.long sys_mysyscall
在linux-3.2.11/arch/x86/ia32/ia32entry.S中加入:
.quad sys_mysyscall

第五步

在linux-3.2.11/arch/x86/include/asm/unistd_32.h中加入:

#define __NR_mysyscall          349
并将
#define NR_syscalls 349
替换为

#define NR_syscalls 350
(这里根据实际情况,__NR_mysyscall为现有最大值,NR_syscalls加一即可)

第六步

重新编译、安装、重启

测试

查看/proc/kallsyms中是否有mysyscall,如果有,表示符号已经导出。

编写测试程序:

#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
        printf("%d\n", syscall(__NR_mysyscall));
        return 0;
}
编译运行,输出0即为正确,-1为错误。
若运行正确,用dmesg查看,末尾有输出:This is my sys call!



  


  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics