虽然CPU是操作系统调度的最小单位,Linux内核通过进程控制块PCB(结构体为task_struct)给每个进程打包了身份、状态、资源等全部信息。为了让大家快速对照核心字段,这里只挑出pid、state、policy这些重点。ARM架构的额外寄存器保存区、地址上限、抢占计数器等数据都被塞进了thread_info。它紧随task_struct出现,本质上就是内核栈的入口坐标。 系统启动时会先创建一条不可克隆的init_task作为唯一进程模板。普通进程通过dup_task_struct()克隆时,内核栈空间只会分配一次。这时候CPU通过读取sp_el0寄存器就能找到栈顶,顺着栈顶找到thread_info,再定位到task_struct完成一次“查身份证”操作。这种三角关系不仅高效,还避免了重复开销。 除了它是CACHE对齐的,extern struct task_struct init_task __aligned(L1_CACHE_BYTES)这句话还揭示了对齐细节。虽然在示意图中显示task_struct里面装了comm[TASK_COMM_LEN]这样的信号处理信息和程序计数器pc,以及mm_struct内存指针等大块数据,但这只是冰山一角。 内核中想获取当前进程是谁非常简单,current = get_current()就够了。背后的原理是把用户空间栈指针sp_el0读出来强制类型转换。因为栈底已保存了thread_info地址,而thread_info又紧挨着task_struct开头,一次转换就能拿到完整的进程描述符。无论何时内核都能“秒回”当前运行者身份,整个过程原子且高效。