博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (八) 27 linux-5.11 OK6410A 进程角度 linux TCB 的分析
阅读量:4284 次
发布时间:2019-05-27

本文共 2528 字,大约阅读时间需要 8 分钟。

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_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)进程的双链表
  • arm32 的thread_info
// 定义在 arch/arm/include/asm/thread_info.h 中,共 23 行task : 指向 task_structcpu_context : 保存  寄存器tp_value : 保存 cp15 c13 寄存器, 为了支持 TLSsyscall : 保存通过异常陷入内核的用户进程的 具体系统调用number(syacall number)???

转载地址:http://xcigi.baihongyu.com/

你可能感兴趣的文章
google play in app billing
查看>>
cakephp发送post请求
查看>>
android ant
查看>>
Cocos2d-x PluginX (一)使用
查看>>
大神提供的C++ SHA1,为了能够加密字符串,我加了两个方法
查看>>
lua乱斗
查看>>
cocos2d-x +lua
查看>>
cocos2d-x 3.8.1 Widget 置灰的实现
查看>>
beego实战笔记
查看>>
提取非行间样式
查看>>
<<go语言实战>>读书笔记
查看>>
makefile的学习
查看>>
ascll和unicode对应的char,wchar_t存储字符
查看>>
vc滚动条 WM_VSCROLL消息16位屏障问题
查看>>
mfc CEdit焦点获取
查看>>
mfc动态按钮
查看>>
vs 获取当前程序文件的路径方法
查看>>
vc 回调函数
查看>>
Marddown学习
查看>>
Mac os中idea使用try catch快捷键
查看>>