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

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

为了添加这些,我将它们放在系统调用表中 (/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 中的编号)。我觉得它们应该匹配——但由于这只是美化的调试信息,我想我会把这个谜留到下一次,并称其为好。

最佳答案

我需要添加另一组相关数字。文件/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中的编号)

关于linux - 未找到新的系统调用(linux 内核 3.0.0)我应该从哪里开始寻找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8411788/

相关文章:

Android 和 SO_KEEPALIVE - sleep 设备是否仍会发送 keepalive 段?

linux - gdb catch 系统调用条件和字符串比较

c - 如何强制 gcc 使用 int 进行系统调用,而不是 sysenter?

即使在对等方挂断后,poll() 也能返回 POLLIN 事件吗?

linux - 在内核 makefile 的函数中添加注释

amazon-web-services - 带有 Nginx 和 PHP-FPM 的 AWS EC2 - 不能将 CPU 推到 50% 以上

c - 使用 dev_add_pack 的协议(protocol)处理程序消耗 CPU

Linux Bash ... 如果时间 > 20 :00 then echo 'hello' fi

c - 如何在另一个线程完成后执行另一个线程?

c - 为什么有些 Linux 系统调用没有包装器,却被记录为好像有包装器?