как ограничить время системного вызова задачи в ядре linux

цель: я хочу ограничить время, в течение которого задача может выполнять системный вызов. поэтому я добавляю переменную noexec_count в task_struct в файле: include/linux/sched.h, например:

int exec_count;/*inserted by KaiwingHo line:861*/

Кстати, значение по умолчанию для exec_count равно -1, это означает, что для системного вызова не будет ограничений. И когда я устанавливаю положительное целое число, это означает, сколько раз задача может выполнить системный вызов. А 0 означает, что системный вызов никогда не будет выполнен. по заданию.

Из приведенного выше, вы знаете, я должен установить значение по умолчанию -1 для exec_count каждой задачи. И я делаю это в файле kernel/fork.c: метод copy_process():

p->pid = pid;
    p->exec_count=-1;/*line:929inserted by KaiwingHo;the value of noexec shows how many times one task can be called
    by method exec();default value is -1;and so on*/
    retval = -EFAULT;

И, как я знаю, каждый системный вызов, в конце концов, приходит к методу do_execve() в файле fs/exec.c. Итак, я добавляю в этот метод следующее, например:

/**
 * inserted by KaiwiiHo
 * the usage of the noexec is shown in sched.h line:695
 */
if(!current->exec_count)
goto out_ret;
if(current->exec_count > 0)
current->exec_count--;

И, наконец, я добавляю свой собственный системный вызов, например: /** * вставленный KaiwiiHo * установите значение noexec задачи * */

asmlinkage long sys_noexec(int times)
{
    int ret=current->exec_count;
    if(ret>=-1)
    current->exec_count=times;
    return ret;
}

Все, включая перекомпиляцию и перезагрузку, работает нормально. Итак, я прохожу тест, например:

#include <stdio.h>
#include <sys/types.h>
#include <linux/unistd.h>
#include </usr/include/errno.h>

#define __NR_noexec 294

_syscall1(long,noexec,int,times);

int main()
{
    int ret;
    ret=noexec(0);
    printf("exec_count=%d\n",ret);
    int pid;
    pid=fork();
    if(pid>0)
    {
        int val;
        val=noexec(0);
        printf("val:noexec=%d.\n",val);
        int i;
        i=5;

        if(i=fork()>0)
            printf("i can fork()!\n");

    }

    return 0;
}

И вывод:

exec_count=-1
exec_count=-1
val:noexec=0.
exec_count=-1
val:noexec=0.
i can fork()!

В соответствии с выводом я думаю, что системный вызов, noexec() определенно подействует. И exec_count задачи был пересмотрен. Но fork() также может быть вызван. Поэтому мне интересно, что я не могу ограничить время. И мне интересно то, что я добавляю в метод do_exeve(), не вступает в силу. Кто-нибудь может показать мне, почему? Спасибо


person kaiwii ho    schedule 10.02.2012    source источник
comment
Подход кувалдой состоит в том, чтобы познакомиться с alarm(3); однако не каждый системный вызов может быть прерван сигналами.   -  person tbert    schedule 10.02.2012
comment
но каждый системный вызов, в конце концов, будет выполнять метод do_execve(). И я уверен, что exec_count уже установлен в каждой задаче. Но он просто не действует.   -  person kaiwii ho    schedule 11.02.2012
comment
И, кстати, я не совсем понимаю твой смысл.   -  person kaiwii ho    schedule 11.02.2012


Ответы (1)


И насколько я знаю, каждый системный вызов в конце концов приходит к методу do_execve() в файле fs/exec.c.

Это неправильно.

Здесь заканчивается только системный вызов execve().

person caf    schedule 11.02.2012