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

Mat*_*ice 20 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$ 
Run Code Online (Sandbox Code Playgroud)

我也用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;
}
Run Code Online (Sandbox Code Playgroud)

为了添加这些,我将它们放在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
Run Code Online (Sandbox Code Playgroud)

以下是调用本身的代码(../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;
}
Run Code Online (Sandbox Code Playgroud)

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

不可否认,这与家庭作业有关.该任务是关于修改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中的编号).我觉得他们应该匹配 - 但是因为这只是美化的调试信息,我想我会再把这个谜留下来,并称之为好.

Mat*_*ice 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 中的编号)