我试图添加一个系统调用到需要root权限运行的linux内核(版本:3.10.91)。
你可以看到我的尝试如下:
#include <linux/kernel.h> #include <linux/linkage.h> #include <linux/sched.h> #include <asm/current.h> #include <asm/errno.h> asmlinkage long sys_set_casper(pid_t pid, int value) { struct task_struct *process; if (!capable(CAP_SYS_ADMIN)) return -EPERM; //valid values are 0,1,2,3 if (value != 0 && value != 1 && value != 2 && value != 3 ) return -EINVAL; process = find_task_by_vpid(pid); if (process == NULL) return -ESRCH; //modify the casper field accordingly process->casper = value; return 0; }
Casper只是我添加的一个任务描述符。 基本上,当casper值为1时,我希望进程被隐藏(对ps,pstree,top等不可见)。内核重新编译jut很好(我还在base.c中做了必要的修改等)。
我试着用下面的代码test.c来testing我的系统调用:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #define NR_set_casper 351 int main(int argc, char **argv) { long y; printf("PID of current process: %d\n\n", getpid()); printf("Call set_casper system call to set flag 1\n"); y = syscall(NR_set_casper, getpid(), 0); printf("Return value of set_casper system call: %ld\n", y); if (y < 0) { printf("set_casper system call failed. Run with sudo\n"); return EXIT_FAILURE; } return 0; }
我编译并运行如下:
gcc test.c
sudo ./a.out
输出是:
PID of current process: 3852 Call set_casper system call to set flag 1 Return value of set_casper system call: -1 set_casper system call failed. Run with sudo
奇怪的是,即使删除了sudo控制行之后:
if (!capable(CAP_SYS_ADMIN)) return -EPERM;
并重新编译内核,我仍然有同样的错误。
基本上,为什么我的sys_set_casper函数返回-1?
编辑
我已经添加了:351 i386 set_casper sys_set_casper to arch / x86 / syscalls $ gedit syscall_32.tbl
不过,我的系统是64位的。 这可能是问题吗?
正如其他人在评论中所说的那样,问题是我根本没有打电话给系统调用。 我只是把我的电话添加到64位系统调用表,并再次尝试一切,它的工作。