为Arm / Raspberry PI扩展Rasbian内核(Linux Kernel 3.10.28) – 如何正确添加自己的系统调用?

我需要添加一个自己的系统调用Raspbian Linux内核。 现在,我search了大约2天后find解决scheme卡住了。

要添加一个系统调用,我基本上遵循总体大纲( http://elinux.org/RPi_Kernel_Compilation )使用来自以下git仓库的内核源代码:

混帐://github.com/raspberrypi/tools.git

我已经使用crosstool-ng( http://www.kitware.com/blog/home/post/426 )安装了一个交叉编译环境。

以上所有这些工作。 我能够编译和部署一个新的内核。 我还可以为Raspbian进行交叉编译。

我正在尝试添加“hello world”系统调用。 该函数驻留在它自己的实现文件(kernel / helloworld。?)中,并被实现为:

helloworld.c:

#include <linux/linkage.h> #include <linux/kernel.h> #include <linux/random.h> #include "helloworld.h" asmlinkage long sys_helloworld(){ printk (KERN_EMERG "hello world!"); return get_random_int()*4; } 

helloworld.h:

 #ifndef HELLO_WORLD_H #define HELLO_WORLD_H asmlinkage long sys_helloworld(void); #endif 

Makefile被相应地扩展。

我现在卡在错误消息

 AS arch/arm/kernel/entry-common.o arch/arm/kernel/entry-common.S: Assembler messages: arch/arm/kernel/entry-common.S:104: Error: __NR_syscalls is not equal to the size of the syscall table make[1]: *** [arch/arm/kernel/entry-common.o] Error 1 

按照编写新系统调用的build议,我添加了以下内容:

  • 弓/ ARM /内核/ calls.S

     CALL(sys_helloworld) 
  • 拱/臂/包括/ uapi / ASM / unistd.h中

     #define __NR_helloworld (__NR_SYSCALL_BASE+380) 
  • 包括/ uapi / ASM-通用/ unistd.h中

     #define __NR_helloworld 274 __SYSCALL(__NR_helloworld, sys_helloworld) #define __NR_syscalls 275 
  • 拱/ 86 /系统调用/ syscall_32.tbl

     351 i386 helloworld sys_helloworld 

我现在正在解决这个错误。

在移除calls.S中的行时,内核编译正常; 尽pipe我无法调用系统调用。 当添加上面的行,我收到提到的错误。

供参考:testing系统调用的客户端代码是:

 #include <linux/unistd.h> #include <stdio.h> #include <sys/syscall.h> int main (int argc, char* argv[]) { int i=atoi(argv[1]); int j=-1; printf("invocing kernel function %i\n", i); j=syscall(i); /* 350 is our system calls offset number */ printf("invoked. Return is %i. Bye.\n", j); return 0; } 

所有其他系统调用(例如1 == sys_exit)都可以正常工作。

任何想法我失踪? 例如,我没有完全得到如何实施rasens的答案。

arch/arm/include/asm/unistd.h文件中定义的_NR_syscalls这个值将始终为__NR_last_syscall+1 。 因此在你的情况下_NR_syscalls应该被修改为381,但是这个改变也会给出同样的错误,因为在syscall表中填充。 因此将其定义为384.这解决了编译错误。 以下变化是没有必要的:

 include/uapi/asm-generic/unistd.h #define __NR_helloworld 274 __SYSCALL(__NR_helloworld, sys_helloworld) #define __NR_syscalls 275 arch/x86/syscalls/syscall_32.tbl 351 i386 helloworld sys_helloworld