linux的 TCB
idle 进程的 TCB 分成了 两块
struct task_struct init_task
void *stack;
struct thread_info init_thread_info
.task = &init_task
为什么要分为两块
1. 作用不同
task_struct 负责
thread_info 负责
2. 架构相关度不同
task_struct 架构无关
thread_info 架构相关
为什么要相互索引
state : 进程的状态,存在5种状态
sigpending : 如果为1,表示进程接收到 信号还未处理
counter : 调度相关:
need_resched : cpu 从内核空间返回用户空间会调度该进程
addr_limit : 虚拟地址空间的上线
exit_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 : 存放了 应用程序对 系统类型 的要求
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 . 对于内核进程,为NULL
active_mm : 对于用户进程,指向用户进程的mm_struct , 对于内核进程,为 指向内核进程的mm_struct
fs
files : 指向 一个 files_struct
tty
real_timer : 内核的定时器队列
times/per_cpu_utime/per_cpu_stime
it_real_value
stack : 指架构相关的资源(寄存器)
signal : 信号相关的资源
家族树 : p_opptr p_pptr p_cptr p_ysptr p_osptr
real_parent : 当前进程的父进程的task_struct 数据结构的地址
children : 当前进程的子进程的链表地址
sibling : 当前进程的兄弟进程的链表地址
group_leader : 进程组的组长
hash table : pidhash
list : next_task prev_task
运行队列 : run_list
task : 指向 task_struct
cpu_context : 保存 寄存器
tp_value : 保存 cp15 c13 寄存器, 为了支持 TLS
syscall : 保存通过异常陷入内核的用户进程的 具体系统调用number(syacall number)???