我创建了两个新的syscall,但是当我尝试测试它们时,出现以下错误:
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;
}
我试图弄清楚我是否正在破坏测试代码(也许我需要添加更多内容或链接一些内容?)或者如果我在添加syscall时忽略了某些内容。随着重新编译内核所花费的时间,这真的可以帮助我知道从哪里开始寻找。
诚然,这与家庭作业有关。该作业是关于修改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,其中###是syscall_table_32.c中的编号(不是unistd.h中的编号)。我觉得他们应该匹配-但由于这只是美化的调试信息,我想我会再说一次这个谜,并称其为好。 最佳答案
我需要添加另一组相关数字。为了正确添加系统调用,还需要修改文件/linux-3.0/arch/x86/kernel/syscall_table_32.c。
将.long sys_get_slob_amnt_free
和.long sys_get_slob_amnt_claimed
添加到该文件并重建内核后,我可以使用syscall(###)来打我的syscall,其中###是syscall_table_32.c中的编号(而不是unistd.h中的编号)
关于linux - 找不到新的syscall(Linux内核3.0.0),我应该从哪里开始寻找?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8411788/