цель: я хочу ограничить время выполнения задачи syscall.
Итак, я добавляю переменную noexec_count в task_struct в файле:
включать / Linux / sched.h, как:
int exec_count;/*inserted by KaiwingHo line:861*/
кстати, значение по умолчанию для exec_count равно -1, это означает, что для syscall ограничения не будет. И когда я устанавливаю положительное целое число, это означает, сколько раз задача может выполнить syscall. И 0 означает, что syscall будет никогда не было сделано задачей.
Сверху, вы знаете, я должен установить значение по умолчанию, -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()!
В соответствии с выводом, я думаю, что syscall, noexec () определенно действует. И задание exec_count было пересмотрено. Но также может быть вызван fork (). Так что мне интересно, что я не могу ограничить время. И мне интересно, не влияет ли то, что я добавляю в метод do_exeve ().
Кто-нибудь может показать мне, почему? THX