目的:タスクがシステムコールを作成できる時間を制限したい。同様に、/ linuxの/ sched.hが含ま : はそう、私は変数、noexec_count、ファイル内のtask_structでの追加方法によってLinuxカーネルでタスクのシステムコールの時間を制限する方法
int exec_count;/*inserted by KaiwingHo line:861*/
、exec_countのデフォルト値は-1で、それはそこにすることを意味しますsyscallの制限はありません。また、私がpostive integerを設定すると、タスクがsyscallを作成できる回数を意味します。0は、syscallが決してタスクによって作られないことを意味します。
上記のように、私はデフォルト値-1をすべてのタスクのexec_countに設定する必要があります。 と私はこれを行うには、ファイル、カーネル/ 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.Soは、私は次のように、この方法では次の行を追加します。
/**
* 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;
}
すべてのものは、再コンパイルやリブートと同様にokです。 だから、私のような、テストを取る:
#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()は間違いなくeffects.Andタスクのexec_countを取ることを考えますしかし、fork()も呼び出すことができます。私は時間を制限することができないのだろうかと思っています。私はdo_exeve()メソッドに何を追加しても効果がないのでしょうか? 誰でも、なぜ私を見ることができますか?THX
sledgehammerのアプローチは、alarm(3)を知ることです。しかし、すべてのシステムコールがシグナルによって中断されるわけではありません。 – tbert
しかし、すべてのsyscallは最終的にメソッドdo_execve()に実行されます。exec_countにはすべてのタスクでsetadyが設定されています。 –
そして、ところで、私は実際には、意味を理解していません。 –