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

20

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

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;
}

为了添加它们,我将它们放入系统调用表中 (/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
这真的是你编译的同一份代码吗?我在你的测试代码中没有看到任何对sys_get_slob_amnt_free的调用。 - bdonlan
@RobinGreen,这不会影响用户空间编译(而且那个路径也是错误的)。 - bdonlan
我在测试代码中尝试了 __NR_get... 和 sys_get... 两种方法,两次的结果都相同。 - MatrixManAtYrService
3
你尝试过只使用syscall(270)吗? - bdonlan
4
+1 用于记录解决方案。 - Corey Henderson
显示剩余2条评论
1个回答

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 中的编号)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接