添加一个syscall

我们之前学习的各种内核态与用户态数据交换时都需要系统调用,只是我们没感受到,而这次我们向内核添加一个自己的syscall,来感受下这一功能的特殊魅力。
下面说明在Kernel源码里如何添加一个syscall:
1.在include/linux/syscalls.h文件里最后一行的#endif前添加自己的系统调用函数声明,内容如下:
asmlinkage long sys_slam(void);
2.在kernel/sys.c文件中,我们在SYSCALL_DEFINE0(getegid) 定义后面添加上面函数的定义,内容如下:
SYSCALL_DEFINE0(slam)
{
        printk("Hello slam call!\n");
        return THREAD_SIZE;
}
这里的 SYSCALL_DEFINE0宏表示我们的系统调用是无参的,该宏在上面syscalls.h头文件中定义。
3.添加系统调用向量,在arch/x86/syscalls/syscall_64.tbl文件中添加系统调用号和系统调用服务程序入口(如果是32位系统,则修改syscall_32.tbl文件),在313号系统调用后面添加如下内容:
314 common slam sys_slam
4.配置完内核后,我们重新编译安装Kernel,在源码根目录下使用make和sudo make install命令;
5.重启机器后需要写一个用户态的应用程序来测试添加的系统调用是不是成功,我们创建一个文件slam_syscall.c,文件内容如下:
#include <linux/unistd.h>
#include <sys/syscall.h>
#include <stdio.h>

int main(void)
{
        long stack_size = syscall(314);
        printf("The kernel stack size is %ld\n", stack_size);
        return 0;
}
相应的Makefile文件内容如下:
all:
        gcc -o slam_syscall slam_syscall.c

clean:
        rm -rf slam_syscall
最终测试程序源码文件目录树如下:
/home/xinu/xinu/linux_kernel_driver_l1/builtin_syscall_test_example/
├── Makefile
└── slam_syscall.c
我们make测试程序后,执行./slam_syscall程序,会打印出如下内容:
The kernel stack size is 8192
即将系统调用的返回值8192这一值结合打印字符串输出,然后在dmesg里也有如下输出:
 [ 1044.065721] Hello slam call!
至此,我们完成了如何在内核源码里添加一个Built-in类型的系统调用,为我们Linux Kernel添砖加瓦铺基础啊。
参考网址:
http://www.embeddedlinux.org.cn/html/yingjianqudong/201304/17-2546.html
http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs/index.html
http://www.ibm.com/developerworks/cn/linux/l-system-calls/index.html
http://nano-chicken.blogspot.com/2010/12/linux-kernel13-syscall.html
http://www.lupaworld.com/home.php?mod=space&uid=401174&do=blog&id=149448
http://blog.sina.com.cn/s/blog_3e4774e30101mbn4.html

评论

此博客中的热门博文

I/O映射之I/O端口

通过Netlink检测网线插拔

使用seq_file