【问题标题】:Passing arguments to custom system call将参数传递给自定义系统调用
【发布时间】:2016-11-04 17:02:43
【问题描述】:

我开发了一个自定义系统调用来记录被杀死的进程。 C 程序杀死进程并调用自定义系统调用,传递被杀死进程的进程 ID,然后系统调用会将被杀死进程的 ID 打印到内核日志中。在这里,我只是传递一个假人来测试系统调用是否写入内核日志。系统调用表中系统调用的编号为329。

下面是我的系统调用

#include <linux/kernel.h>


asmlinkage long sys_killa(char* proc_id)
{

    printk("The process %s has been killed", proc_id);

    return 0;
}

这是我调用自定义系统调用的 C 程序。

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>

int main()
{
    char proc_id[5] = "3219";
    long int sys = syscall(329, proc_id);
    printf("System call sys_killa returned %ld\n", sys);
    return 0;
}

运行 C 程序只需在终端中打印“Killed”。再次运行该程序会使我的虚拟机崩溃。当我使用dmesg 实用程序检查时,内核日志中没有打印任何内容。我究竟做错了什么?

【问题讨论】:

  • 您在内核空间中使用从用户空间获得的指针。哎呀。您绝对应该使用copy_from_user() 等;请参阅现有的系统调用以获取正确的方法。更好的是,不要传递字符串,传递进程 ID(pid_t)。
  • 这解决了我的问题。非常感谢!

标签: linux-kernel parameter-passing system-calls


【解决方案1】:

需要使用pid_t变量而不是String。这是修改后的系统调用:

#include <linux/kernel.h>

asmlinkage long sys_killa(pid_t pid)
{
    long pid_l = (long) pid;

    printk("The process %ld has been killed", pid_l);

    return 0;

}

这是修改后的 C 代码以使用系统调用:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>

int main()
{
    pid_t pid = 3249;
    long int sys = syscall(329, pid);
    printf("System call sys_killa returned %ld\n", sys);
    return 0;
}

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2017-08-25
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多