【发布时间】:2012-01-14 18:08:47
【问题描述】:
我创建了两个新的系统调用,但是当我尝试测试它们时出现以下错误:
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 中的编号) )。我觉得它们应该匹配——但由于这只是美化的调试信息,我想我会再把这个谜团留下来,称它为好。
【问题讨论】:
-
这真的和你编译的代码一样吗?我在您的测试代码中没有看到任何对 sys_get_slob_amnt_free 的调用。
-
也许您需要将系统调用函数的行添加到 linux-3.0/mm/slob.h?
-
@RobinGreen,这不会影响用户空间编译(而且那是错误的路径)
-
你试过只使用 syscall(270) 吗?
-
+1 用于记录解决方案
标签: linux kernel system-calls