案例 新增内核系统调用
案例目的
理解linux内核系统调用
掌握增加系统调用的方法
硬件设备
PC机(X86兼容机)
CW210开发板
软件环境
Ubuntu12.04
arm-none-linux-gnueabi-gcc
案例内容
在linux内核中增加新的系统调用,在用户空间编程实现对新增系统调用的使用。
案例步骤
1、进入内核源码根目录cd /opt/kernel
2、执行“vim arch/arm/kernel/sys_arm.c”,在文件最后增加
asmlinkageint sys_add(int x, int y)
{
printk("call sys_add\n");
return x+y;
}
asmlinkage:声明c语言函数给汇编语言函数传递参数,是通过栈而不是通过R0~R3寄存器!默认是通过寄存器来传递的!
3、执行vi arch/arm/include/asm/unistd.h,在“#define __NR_recvmmsg (__NR_SYSCALL_BASE+365)”后增加如下代码
“#define __NR_add (__NR_SYSCALL_BASE+366)”
4、执行“vi arch/arm/kernel/calls.S”,在
“/*365 */ CALL(sys_recvmmsg)”后增加“CALL(sys_add)”。
5、在内核源码根目录下执行 make zImage
6、拷贝生成的镜像文件到tftp主目录
“cparch/arm/boot/zImage /tftpboot/”
用新内核重新引导系统
7、创建测试调用该系统调用的应用程序newsyscall.c。
8、生成可执行文件
“arm-linux-gccnewsyscall.c -o newsyscall”
9、拷贝newsyscall到NFS目录。
10、在开发板终端执行“./newsyscall”
案例代码
newsyscall.c
#include<stdio.h>
#include <linux/unistd.h>
int main(int argc,char **argv)
{
int ret;
ret = syscall( 366, 100, 200 );
printf("The result of new syscall: %d!\n", ret);
return 0;
}