如何限制任务的时间';linux内核中的syscall

如何限制任务的时间';linux内核中的syscall,c,linux,linux-kernel,linux-device-driver,archlinux,C,Linux,Linux Kernel,Linux Device Driver,Archlinux,目的:我想限制任务进行系统调用的时间。 因此,我在文件的task_结构中添加了一个变量noexec_count: 包括/linux/sched.h,如: int exec_count;/*inserted by KaiwingHo line:861*/ 顺便说一下,exec_count的默认值是-1,这意味着系统调用没有限制。当我设置一个正整数时,它意味着一个任务可以进行系统调用的次数。0意味着一个任务永远不会进行系统调用 从上面可以看出,我应该将默认值-1设置为每个任务的执行计数。 我在ke

目的:我想限制任务进行系统调用的时间。 因此,我在文件的task_结构中添加了一个变量noexec_count: 包括/linux/sched.h,如:

int exec_count;/*inserted by KaiwingHo line:861*/
顺便说一下,exec_count的默认值是-1,这意味着系统调用没有限制。当我设置一个正整数时,它意味着一个任务可以进行系统调用的次数。0意味着一个任务永远不会进行系统调用

从上面可以看出,我应该将默认值-1设置为每个任务的执行计数。 我在kernel/fork.c文件中这样做: 方法复制\u进程():

正如我所知,每个系统调用最终都会到达文件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--;
最后,我添加了自己的系统调用,如: /** *由Kaiwiho插入 *设置任务noexec的值 * */

一切,如重新编译和重新启动,运行正常。 所以,我做了一个测试,比如:

#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;
}
根据输出,我认为syscall noexec()肯定会生效。并且任务的exec_计数已经修改。但是,fork()也可以被调用。所以我想知道我不能限制时间。我想知道我在do_exeve()方法中添加的内容是否会生效。 有人能告诉我为什么吗?谢谢

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

这是不正确的


只有
execve();然而,并不是每个系统调用都会被信号打断。但是,每个系统调用最终都会运行到方法do_execve()。我确信每个任务中都设置了exec_计数。但它不会生效。顺便说一句,我并没有真正理解你的意思。
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()!