如何为Linux内核task_struct添加weight字段并实现fork继承?
关于Linux 18.04内核fork时自定义PCB字段继承的问题
背景与已完成操作
作为操作系统课程作业,我正在基于Linux 18.04内核添加系统调用,需为进程控制块(PCB,即task_struct)新增名为weight的字段,新系统调用将对该字段进行修改或读取(无实际业务用途)。目前已完成两处修改:
- 在
/include/linux/init_task.h的INIT_TASK宏中添加weight字段并初始化为0:
#define INIT_TASK(tsk) \ { \ INIT_TASK_TI(tsk) \ .state = 0, \ .stack = init_stack, \ .weight = 0, \ ...
- 在
/include/linux/sched.h的task_struct结构体中添加weight字段:
struct task_struct { #ifdef CONFIG_THREAD_INFO_IN_TASK /* * For reasons of header soup (see current_thread_info()), * this must be the first element of task_struct. */ struct thread_info thread_info; #endif /* -1 unrunnable, 0 runnable, >0 stopped: */ volatile long state; long weight; ...
核心疑问
我希望子进程在fork时能继承父进程的weight字段(例如init进程的子进程weight为0,后续子进程继承父进程的当前weight值),想明确:
- fork机制对新增的
weight字段默认会如何处理? - 是否需要修改fork相关代码手动复制该字段,还是会自动从
init_task继承?
解答
Linux的fork流程中,子进程的task_struct并非直接从init_task复制,而是通过复制父进程的task_struct创建。但内核仅会自动复制fork流程中明确处理过的字段,你新增的weight不在默认复制范围内,因此必须手动修改fork相关代码才能实现继承。
具体操作步骤:
- 找到负责复制进程结构体的核心函数
copy_process(位于kernel/fork.c); - 在该函数中,当成功创建子进程的
task_struct指针p后,添加一行代码将父进程的weight值赋值给子进程:
p->weight = current->weight;
这里current是指向父进程task_struct的全局指针。
另外,你在INIT_TASK中对weight的初始化只会作用于init进程的初始值,后续所有进程的weight初始值均来自父进程的继承,因此当前的初始化设置是正确的,能保证init进程的子进程继承到0值。
内容的提问来源于stack exchange,提问作者mikealexx
相关产品推荐
相关产品推荐

