gpt4 book ai didi

c - 如何向内核 task_struct 添加一个字段?

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:03 28 4
gpt4 key购买 nike

我正在尝试编写一个内核模块来检测 fork 炸弹,为此,我想向 task_struct 添加一个字段 int descendantCount。到目前为止,这是我的代码:

struct task_struct *pTask;
for_each_process(pTask)
{
struct task_struct *p;
*p = *pTask;

//trace back to every ancestor
for(p = current; p != &init_task; p->parent)
{
//increment the descendant count of p's parent
p->descendantCount = p->descendantCount +1 //want to do something like this

}
}

基本上,我试图遍历每个进程,对于每个进程,遍历它的所有祖先并增加祖先的 descendantCount,这是我想添加到 任务结构

我找到了 this , 和 this ,但我仍然对如何去做这件事感到很困惑,因为我是内核编程的新手......我应该去 include/linux/sched.h 并添加那里有场?像这样:

 struct task_struct { 
......

pid_t pid;

....
int descendantCount;

}

任何帮助将不胜感激,谢谢!!

最佳答案

目前还不清楚实际的想法是什么 - 这应该在 fork 上执行吗?无论如何,无论伪代码如何粘贴样本,想法都是错误的,实现也是有问题的。

首先,descendantCount 是一个使用驼峰式命名的名称,这使得它与其余代码不一致。一个不太坏的名字是 descendant_count。

计数器修改必须使用原子操作才能不丢失写入,否则整个事情都需要使用独占锁。

遍历使用 ->parent ,它会随着 ptrace 开始指向跟踪器而发生变化。你想要的 parent 可以在 ->real_parent 中找到。

除非没有提供 RCU 保护,因此可以在遍历进程时释放进程,使循环成为释放后使用。

使用 RCU 或 tasklist_lock 遍历将是安全的,但毫无意义。当原始父进程死亡时,可以将进程重新设置为 init,从而破坏您的分层方法。

进程必须以某种方式分组,但父<->子关系不适合此目的。这种分组的一些工作示例是 cgroups 和简单的东西,如 uids/gids。

总而言之,这行不通。

鉴于您不仅对内核本身而且对 C 也是新手,我只能建议暂时关注用户空间。

关于c - 如何向内核 task_struct 添加一个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36212629/

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