2015-10-25 2 views
3

Я пытаюсь добавить системный вызов в ядро ​​linux (версия: 3.10.91), для которого требуются права root.Добавление нового системного вызова в Linux, для которого требуются привилегии root

Вы можете увидеть мою попытку ниже:

#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 просто задача описатель, который я добавил. В принципе, я хочу, чтобы процесс был скрытым (не видимым для ps, pstree, top и т. Д.), Когда значение casper равно 1. Ядро перекомпилирует jut fine (и я также сделал необходимые изменения в base.c и т. Д.).

Я попытался тестированием моего системного вызова со следующим кодом, test.c:

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

я скомпилировать и запустить следующий образом:

НКА test

Суды ./ 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?

EDIT

Я добавил это: 351 i386 set_casper sys_set_casper к арки/x86/$ Gedit системных вызовов syscall_32.tbl

Однако моя система 64 бит. Это может быть проблема?

+0

Возможно, ваш 'sys_set_casper' никогда не вызывается. Кстати, как вы регистрируете этот системный вызов? – Tsyvarev

+0

Я добавляю подробное описание того, что я делал шаг за шагом. – SpiderRico

+1

У вашего ядра, вероятно, нет syscall с номером 351. В зависимости от архитектуры вам нужно будет добавить запись в определенный файл. Для 'arm' это находится в' arch/arm/kernel/calls.S'. –

ответ

1

Проблема была, как другие, высказанные в комментариях, в том, что я вообще не звонил в системный вызов. Я просто добавил свой вызов в 64-битную таблицу системных вызовов и все снова попытался, и это сработало.

Смежные вопросы