在嵌入式开发中,增加内核系统调用虽然极少涉及到,但是我们掌握了这个过程,对于开发者更深入的了解内核,了解应用层和内核通信的过程是非常有帮助的。
一、先简单介绍一下添加系统调用的步骤:
1:内核空间要做的事情(没有先后顺序)
(1)在arch/arm/include/asm/unistd.h(本人开发主机的目录)中添加一个新的系统调用号。
(2)在arch/arm/kernel/call.S(系统调用表)中添加一个新项。
(3)在arch/arm/kernel/sys_arm.c中添加一个内核函数的实现,类似sys_write.
2:用户空间要做的事情
linux系统提供了一个系统调用函数syscall来帮助程序员完成:保存系统调用号到R7寄存器中,然后调用SVC触发软中断的工作。
函数原型为:
int syscall(int number,...);
返回值就是系统调用号对应的函数的返回值,如果出错一律返回-1;
number:系统调用号;
...系统调用号对应的函数的参数;
二、下面以我的开发环境为例,介绍一个简单的添加系统调用的过程。
1.首先进入内核源码的根目录 cd /opt/kernel
2.执行"vim arch/arm/kernel/sys_arm.c",在文件最后添加
asmlinkage int sys_add(int x,int y)
{
printk("call sys_add\n");
return x+y;
}//加法函数实现
3.执行“vi arch/arm/include/asm/unistd.h”,在“#define __NR_recvmmsg (__NR_SYSCALL_BASE+365)”后增加如下代码:
#define __NR_add (__NR_SYSCALL_BASE+366) //添加新的系统调用号
4.执行“vim arch/arm/kernel/call.S”,在“/*365*/ CALL(sys_recvmmsg)”后增加 “CALL(sys_add)”. //在系统调用表中添加一 个新项
5.在内核源码根目录下执行make zImage
6.拷贝生成的镜像文件到tftp目录下 cp /arch/arm/boot/zImage /tftpboot/ ------用新内核重新引导系统
7.创建测试用例,生成可执行文件
8.把可执行文件拷贝到NFS目录下
9.在开发板上执行。
阅读(2320) | 评论(0) | 转发(0) |