未找到新的系统调用(linux内核3.0.0)我应该从哪里开始查找?

时间:2011-12-07 07:28:40

标签: linux kernel system-calls

我创建了两个新的系统调用,但是当我尝试测试它们时,我收到以下错误:

matt@ubuntu:~/test$ gcc test.c 
test.c: In function ‘newcall’:
test.c:6:17: error: ‘sys_get_slob_amnt_free’ undeclared (first use in this function)
test.c:6:17: note: each undeclared identifier is reported only once for each function it appears in
matt@ubuntu:~/test$ 

我也用syscall(sys_get_slob_amnt_free)尝试了相同的结果。

这是测试代码:

#include <unistd.h>
#include <stdio.h>

unsigned long newcall()
{
        return syscall(__NR_get_slob_amnt_free);
}
int main()
{
        printf("%d\n", newcall());
        return 0;
}

为了添加这些,我将它们放在syscall表中 (/usr/src/linux-3.0/include/asm-generic/unistd.h)

#define __NR_sendmmsg 269
__SC_COMP(__NR_sendmmsg, sys_ sendmmsg, compat_sys_sendmmsg)
/** my changes here **/
#define __NR_get_slob_amnt_free 270
__SYSCALL(__NR__get_slob_amnt_free, sys_get_slob_amnt_free)
#define __NR_get_slob_amnt_claimed 271)
__SYSCALL(__NR_get_slob_amnt_claimed, sys_get_slob_amnt_claimed)
/**  /my changes **/

#undef __NR_syscalls
#define __NR_syscalls 272

以下是调用本身的代码(../ linux-3.0 / mm / slob.c)

asmlinkage unsigned int sys_get_slob_amnt_claimed()
{
    return memClaimed;
}

asmlinkage unsigned int sys_get_slob_amnt_free()
{
    return memClaimed - memUsed;
}

我正在试图弄清楚我是否拙劣的测试代码(也许我需要包含更多内容?或链接某些内容?)或者如果我在首先添加系统调用时忽略了某些内容。使用重新编译内核所需的时间,这将真正帮助我知道从哪里开始查找。

不可否认,这与家庭作业有关。该任务是关于修改slob.c,我有一个非常好的处理。我这样做是为了看看我到目前为止所做的修改是否会在任何地方进行。我感谢您给予的任何指导。谢谢!

编辑:已解决(或者至少为我解决了问题)。

非常感谢bdonlan!虽然syscall(270)并没有直接做到,但它让我记忆犹新 - 还有另外一组我完全忽略的相关数字。 为了正确添加系统调用,还需要修改文件/linux-3.0/arch/x86/kernel/syscall_table_32.c

我将.long sys_get_slob_amnt_free.long sys_get_slob_amnt_claimed添加到该文件并重建内核后,我可以使用syscall(###)来查看我的系统调用,其中###是syscall_table_32.c中的编号(不是unistd.h中的编号。我觉得他们应该匹配 - 但是因为这只是美化的调试信息,我想我会再把这个谜留下来,并称之为好。

1 个答案:

答案 0 :(得分:2)

我还需要添加另一组相关数字。还需要修改文件/linux-3.0/arch/x86/kernel/syscall_table_32.c以正确添加系统调用。

一旦我将.long sys_get_slob_amnt_free.long sys_get_slob_amnt_claimed添加到该文件并重建内核,我可以使用syscall(###)来查看我的系统调用,其中###是syscall_table_32.c中的编号(不是unistd.h中的编号。