gpt4 book ai didi

c - 如何限制Linux内核中任务系统调用的时间

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:32 29 4
gpt4 key购买 nike

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

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

顺便说一句,exec_count的默认值是-1,这意味着系统调用没有限制。当我设置一个正整数时,它意味着一个任务可以进行多少次系统调用。0意味着系统调用将从未被任务创建。

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

据我所知,每个系统调用最终都会调用文件 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

最佳答案

And as I know,every syscall will finally comes to the method do_execve() in the file fs/exec.c.

这是不正确的。

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

关于c - 如何限制Linux内核中任务系统调用的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226185/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com