1

目的:我想限制任务可以进行系统调用的时间。所以,我在文件的task_struct中添加了一个变量noexec_count:include/linux/sched.h,例如:

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

顺便说一下,exec_count的默认值为-1,这意味着系统调用没有限制。当我设置一个正整数时,这意味着一个任务可以进行多少次系统调用。0表示系统调用永远不会进行通过任务。

从上面,你知道,我应该将默认值 -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;

而且据我所知,每个系统调用最终都会出现在文件 fs/exec.c 中的方法 do_execve() 中。因此,我在此方法中添加以下内容,例如:

/**
 * 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

4

1 回答 1

2

据我所知,每个系统调用最终都会到达 do_execve()文件中的方法fs/exec.c

这是不正确的。

只有execve()系统调用在这里结束。

于 2012-02-11T12:54:32.783 回答