本文共 2528 字,大约阅读时间需要 8 分钟。
idle 进程的 TCB 分成了 两块 struct task_struct init_task void *stack; // 用于存放 对应的 thread_info 的 地址 struct thread_info init_thread_info .task = &init_task // 对于存放 对应的 task_struct 的地址
为什么要分为两块 // 因为两个东西不是一类人 // 正是因为两个东西不是一类人,所以要分开定义,容易编码 // thread_info 是架构相关的,定义会放到 架构相关代码中 1. 作用不同 task_struct 负责 // 调度算法 选择 哪个进程 为 下一个进程 thread_info 负责 // 寄存器的保存和恢复 2. 架构相关度不同 task_struct 架构无关 thread_info 架构相关为什么要相互索引 // 因为他们都属于 TCB,有千丝万缕的关系 // 正是因为 这些关系, 经常被相互索引
// 定义在 include/linux/sched.h 中,共738行// 所以解读这个结构体是很麻烦的一件事,还是分类解读吧// 分为5类, 状态/特性/资源/组织// 状态 : 会变化,标识进程的状态// 特性 : 一般初始化后就不会变化,标识进程的特征// 资源 : 涉及到保存,恢复,保存了进程的资源// 组织 : 各种 task_struct 之间的联系,表示了进程之间的关系// 其中 资源类 是为了 切换 , 其他类 都是 为了 寻找下一个进程// 下面不对应的 linux-5.11 的 task_struct// 状态state : 进程的状态,存在5种状态 // TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE TASK_ZOMBIE TASK_STOPPEDsigpending : 如果为1,表示进程接收到 信号还未处理counter : 调度相关:need_resched : cpu 从内核空间返回用户空间会调度该进程addr_limit : 虚拟地址空间的上线 // 对于 用户进程 : 0xbfff ffff , 对于 内核线程 0xffff ffffexit_code/exit_signal : 进程退出值 和 终止信号pdeath_signal : 父进程消亡时发出的信号// 特性pid : 进程标识符comm : 可执行程序的名称flag : 描述进程属性的一些标志位binfmt : 存放了 应用程序的文件格式real_cred :认证信息cred : 认证信息user : 指向一个 user_struct // 该数据结构代表进程所属的用户rlim : 进程对各种资源的使用数量的限制cap_effective/cap_inheritable/cap_permitted : 进程权限(ROOT权限的细分)uid/euid/suid/fsuid/gid/egid/sgid/fsgid : 文件操作权限personality : 存放了 应用程序对 系统类型 的要求 // 共 17 种, PER_ 开头exec_domain : 存放了 应用程序 对 系统版本的要求pgrp/session/leader : 一个用户对应一个进程组(session),该用户创建的进程同属于一个组,组内有组长(leader)parent_exec_id/self_exec_id 进程组相关prio : 动态优先级static_prio : 静态优先级normal_prio : 基于static 和 调度策略计算出来的优先级priority : 优先级别rt_priority : 实时进程的优先级policy : 进程的类型(普通进程还是实时类型)sched_class : 调度类se : 普通进程调度实体rt : 实时进程调度实体dl : deadline 进程调度实体cpu_allowed : 进程可以在哪几个cpu上运行// 资源mm : 对于用户进程,指向用户进程的mm_struct . 对于内核进程,为NULLactive_mm : 对于用户进程,指向用户进程的mm_struct , 对于内核进程,为 指向内核进程的mm_structfs files : 指向 一个 files_structttyreal_timer : 内核的定时器队列times/per_cpu_utime/per_cpu_stimeit_real_valuestack : 指架构相关的资源(寄存器)signal : 信号相关的资源// 组织家族树 : p_opptr p_pptr p_cptr p_ysptr p_osptr // 所有进程的家族树real_parent : 当前进程的父进程的task_struct 数据结构的地址children : 当前进程的子进程的链表地址sibling : 当前进程的兄弟进程的链表地址group_leader : 进程组的组长hash table : pidhash // 所有进程的hashtablelist : next_task prev_task // 所有进程的双链表运行队列 : run_list // 特定(成员state 为 TASK_RUNNING)进程的双链表
// 定义在 arch/arm/include/asm/thread_info.h 中,共 23 行task : 指向 task_structcpu_context : 保存 寄存器tp_value : 保存 cp15 c13 寄存器, 为了支持 TLSsyscall : 保存通过异常陷入内核的用户进程的 具体系统调用number(syacall number)???
转载地址:http://xcigi.baihongyu.com/