2012-02-10 16 views
1

目的:タスクがシステムコールを作成できる時間を制限したい。同様に、/ 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

+0

sledgehammerのアプローチは、alarm(3)を知ることです。しかし、すべてのシステムコールがシグナルによって中断されるわけではありません。 – tbert

+0

しかし、すべてのsyscallは最終的にメソッドdo_execve()に実行されます。exec_countにはすべてのタスクでsetadyが設定されています。 –

+0

そして、ところで、私は実際には、意味を理解していません。 –

答えて

2

そして、私が知っているようでは、すべてのシステムコールは最終的にファイルfs/exec.c方法 do_execve()になるでしょう。

これは間違っています。

execve()システムコールのみがここにあります。

関連する問題