OK6410A 开发板 (八) 27 linux-5.11 OK6410A 进程角度 linux TCB 的分析

linux的 TCB
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,有千丝万缕的关系
	// 正是因为 这些关系, 经常被相互索引
  • task_struct
// 定义在 include/linux/sched.h 中,共738行
// 所以解读这个结构体是很麻烦的一件事,还是分类解读吧
// 分为5类, 状态/特性/资源/组织

// 状态 : 会变化,标识进程的状态
// 特性 : 一般初始化后就不会变化,标识进程的特征
// 资源 : 涉及到保存,恢复,保存了进程的资源
// 组织 : 各种 task_struct 之间的联系,表示了进程之间的关系


// 其中 资源类 是为了 切换 , 其他类 都是 为了 寻找下一个进程


// 下面不对应的 linux-5.11 的 task_struct


// 状态
state : 进程的状态,存在5种状态 // TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE TASK_ZOMBIE TASK_STOPPED
sigpending : 如果为1,表示进程接收到 信号还未处理
counter : 调度相关:
need_resched : cpu 从内核空间返回用户空间会调度该进程
addr_limit : 虚拟地址空间的上线 // 对于 用户进程 : 0xbfff ffff , 对于 内核线程 0xffff ffff
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 : 存放了 应用程序对 系统类型 的要求 // 共 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 . 对于内核进程,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							// 所有进程的hashtable
list : next_task prev_task						// 所有进程的双链表
运行队列 : run_list 								// 特定(成员state 为 TASK_RUNNING)进程的双链表



  • arm32 的thread_info
// 定义在 arch/arm/include/asm/thread_info.h 中,共 23 行
task : 指向 task_struct
cpu_context : 保存  寄存器
tp_value : 保存 cp15 c13 寄存器, 为了支持 TLS
syscall : 保存通过异常陷入内核的用户进程的 具体系统调用number(syacall number)???


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值