2009-11-11 108 views
1

我尝试编写一个系统调用。我遵循以下步骤:编写一个系统调用linux

linux/arch/x86/kernel/syscall_table_32.S ---->。 long sys mycall

linux/include/linux/syscalls.h --------> asmlinkage int sys mycall(int i,int j);

LINUX /拱/ 86 /包含/ ASM/unistd_32.h ---->的#define NR的MyCall 333

我改变的linux/Makefile以芯-γ+ =内核/毫米/ FS/IPC/security/crypto/block/mycall/

我创建了一个名为mycall的目录。 ----> LINUX /的MyCall

在这个文件中,我放置mycall.c:

#include <linux/kernel.h> 
asmlinkageintsysmcall(int i,int j) 
{ 
return i + j ; 
} 

6)我创建生成文件。 ---> linux/mycall/Makefile。

obj−y := mycall.o 

然后,我尝试这个系统调用,它总是返回-1。这些行是我在桌面上的测试代码。 testmycall.c

#include <stdio.h> 
#include <sys/syscall.h> 
#define __NR_mycall 333 

int main(void) 
{ 
int x1=10, x2=20, y ; 
y = syscall (__NR_mycall, x1, x2); 
printf (”%d\n”,y); 
return 0 ; 
} 

然后我重新编译内核。如果我编译代码,没有错。当我运行这个程序时,它不会总结两个值。它只是返回总是-1。我的系统调用出了什么问题? (当我重新编译内核时,系统没有浪费时间超过3秒,我想这里可能会出现问题)

回答

2

重新编译内核并重新引导。或者它是一个内核模块?

+0

IMO,内核模块不应该/真的/被用来添加系统调用功能;太多糟糕的巫术可能会发生。 (加上他们是一个错误调试,如果出现问题!) – 2009-11-11 16:44:19

+0

我只是写一个系统调用。我是否需要重新编译内核? – Iguramu 2009-11-11 16:51:02

+0

重新编译系统后,我必须安装吗? (sudo dpkg -i linux-image-2.6.28.10-custom .... deb) – Iguramu 2009-11-11 16:57:38