平台:mini2440
kernel;2.6.32.2\
一.添加系统调用代码
vim arch/arm/kernel/sys_arm.c
sys_arm.c包含了非标准的系统调用
下面是创建一个名为mycall(int number)函数
asmlinkage int sys_mycall (int number)
{
return number;
}
二.连接新的系统调用
添加完新的系统调用后,下一个任务是使内核的其他部门代码知道该新的系统调用函数的存在。编辑两个文件,它们是unistd.h 和calls.S
unistd.h 全路径为 arch/arm/include/asm/unistd.h
该文件包含了系统的调用清单,用来给没一个系统调用分配一个唯一的号码,文件中的每一行格式如下
#define _NR_NAME (_NR_SYSCALL_BASE+NNN)
其中name用系统调用的名字代替,而NNN这是该系统调用对应的号码。
比如将刚才那个加入里面
#define _NR_mycall (_NR_SYSCALL_BASE+365)
这里的365为可用的系统调用号就行
calls.S路径arch/arm/kernel/calls.S该文件最后会被include进entry-common.S
该文件中有类似如下的清单
CALL (NAME)
我在最后添加
CALL (sys_mycall)
重新编译linux内核,在应用程序中便可以进行调用了
编译中出现问题
arch/arm/kernel/built-in.o: In function `__sys_trace_return':
io.c:(.text+0xddc): undefined reference to `mycall'
arch/arm/kernel/built-in.o: In function `sys_oabi_readahead':
io.c:(.text+0x1458): undefined reference to `mycall'
make: *** [.tmp_vmlinux1] Error 1
原来是CALL (sys_mycall)写成了CALL (mycall)
三.在应用程序中使用系统调用是通过如下函数
int syscall (int number,...);
地一个参数number代表系荣调用号,后面的参数列表则是根据实现的系统调用函数sys_mycall的参数来填写,返回值也和sys_mycall的返回值对应。
#include <stdio.h>
#include <unistd.h>
int main()
{
int a;
a=syscall(365,8);
printf("a=%d",a);
return 0;
}