Linux kernel 将参数传递给自定义系统调用

Linux kernel 将参数传递给自定义系统调用,linux-kernel,parameter-passing,system-calls,Linux Kernel,Parameter Passing,System Calls,我开发了一个自定义系统调用来记录被终止的进程。C程序终止进程并调用自定义系统调用,传递终止进程的进程ID,然后系统调用将把终止进程的ID打印到内核的日志中。这里我只是传递一个伪函数来测试系统调用是否写入内核日志。系统调用表中的系统调用编号为329 下面是我的系统调用 #include <linux/kernel.h> asmlinkage long sys_killa(char* proc_id) { printk("The process %s has been ki

我开发了一个自定义系统调用来记录被终止的进程。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;
}
#包括
asmlong sys_killa(char*proc_id)
{
printk(“进程%s已被终止”,进程id);
返回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;
}
#包括
#包括
#包括
#包括
int main()
{
char proc_id[5]=“3219”;
long int sys=syscall(329,proc_id);
printf(“系统调用sys\u killa返回%ld\n”,sys);
返回0;
}

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

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

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

}
#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;
}
#包括
ASM悬挂机构长系统基拉(pid)
{
长pid_l=(长)pid;
printk(“进程%ld已终止”,pid_l);
返回0;
}
这是使用系统调用的修改后的C代码:

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

}
#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;
}
#包括
#包括
#包括
#包括
int main()
{
pid_t pid=3249;
long int sys=syscall(329,pid);
printf(“系统调用sys\u killa返回%ld\n”,sys);
返回0;
}

您正在使用从用户空间获得的指针,就像在内核空间中一样。哎呀。您一定要使用
copy\u from\u user()
等。;有关正确的方法,请参阅现有系统调用。更好的是,不要传递字符串,传递进程ID(a
pid\t
)。这解决了我的问题。非常感谢!