我需要添加一个自己的系统调用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