You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Linux内核task_struct添加weight字段并实现fork继承?

关于Linux 18.04内核fork时自定义PCB字段继承的问题

背景与已完成操作

作为操作系统课程作业,我正在基于Linux 18.04内核添加系统调用,需为进程控制块(PCB,即task_struct)新增名为weight的字段,新系统调用将对该字段进行修改或读取(无实际业务用途)。目前已完成两处修改:

  1. 在/include/linux/init_task.h的INIT_TASK宏中添加weight字段并初始化为0:
#define INIT_TASK(tsk)  \
{                                   \
    INIT_TASK_TI(tsk)                       \
    .state      = 0,                        \
    .stack      = init_stack,                   \
    .weight = 0,                 \
     ...
  1. 在/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相关代码才能实现继承。

具体操作步骤:

  1. 找到负责复制进程结构体的核心函数copy_process(位于kernel/fork.c);
  2. 在该函数中,当成功创建子进程的task_struct指针p后,添加一行代码将父进程的weight值赋值给子进程:
p->weight = current->weight;

这里current是指向父进程task_struct的全局指针。

另外,你在INIT_TASK中对weight的初始化只会作用于init进程的初始值,后续所有进程的weight初始值均来自父进程的继承,因此当前的初始化设置是正确的,能保证init进程的子进程继承到0值。

内容的提问来源于stack exchange,提问作者mikealexx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:49:56