init_task、版本与校准机制与实现详解
源码路径:
rk3588/kernel-6.1/init/init_task.c、version.c、calibrate.c、Makefile
内核版本:Linux 6.1(RK3588 / ARM64)
文档目录:linuxDoc/init/
目录
一、原理
1.1 init_task
内核启动时 当前任务 即 init_task;rest_init 创建的 kernel_init 线程最终 exec 为 PID 1,但模板来自对 init_task 的复制与演化。必须预先配置好信号、调度、namespace、cred 等静态字段。
1.2 版本字符串
UTS_VERSION 出现在 uname -a 与 Oops 信息中,由构建系统生成,区分 SMP/PREEMPT/构建时间。
1.3 calibrate_delay
历史遗留的 loops per jiffy(lpj) 用于 udelay 等粗粒度忙等;ARM64 现代平台多依赖 arch timer,但仍可能调用 calibrate_delay() 打印 BogoMIPS。
二、实现方式
2.1 init_task.c
init_signals/init_sighand:PID 1 级信号结构模板init_task:PF_KTHREAD起始,栈为init_stackCONFIG_THREAD_INFO_IN_TASK:thread_info 嵌入 task_structCONFIG_SHADOW_CALL_STACK:SCS 栈魔数
新进程通过 copy_process 继承/调整这些字段;不要随意改 init_task 布局(架构依赖)。
2.2 版本构建(Makefile + version.c)
- 编译
version.o时使用临时utsversion-tmp.h(UTS_VERSION截断 64 字节) - 最终
version-timestamp.o使用include/generated/utsversion.h - 标志位:
SMP、PREEMPT、PREEMPT_DYNAMIC、PREEMPT_RT build-version脚本:可被KBUILD_BUILD_VERSION覆盖
2.3 calibrate.c
calibrate_delay():在start_kernel中sched_clock_init之后调用- 启动参数
lpj=可跳过校准 CONFIG_GENERIC_CALIBRATE_DELAY控制是否编译calibrate.o
ARM64 RK3588 上 BogoMIPS 数值 不代表 实际 CPU 性能,仅作兼容与日志。
三、关键数据结构
| 符号 | 文件 |
|---|---|
init_task |
init_task.c |
init_stack |
同文件或 arch |
linux_banner |
main.c(版本横幅与 UTS_RELEASE) |
UTS_VERSION |
version.c / 生成头 |
四、RK3588 平台说明
- 无
init_task.c平台专用分支;SMP 8 核(4+4)体现在CONFIG_SMP与UTS_VERSION的SMP标记 - 产品版本号常在 Android/BSP 构建脚本 写
KBUILD_BUILD_VERSION,而非改init_task.c lpj=在极慢串口调试时可用于 缩短 start_kernel 尾部耗时(少见)
五、调试与观测
1 | uname -a |
| 项 | 说明 |
|---|---|
linux_banner 启动首行 |
确认内核 6.1 与编译主机 |
| BogoMIPS 行 | 来自 calibrate_delay |
init_task 栈溢出 |
CONFIG_STACK_VALIDATION / KASAN 报告 |
附录:源码索引
| 文件 | 职责 |
|---|---|
init/init_task.c |
init_task |
init/version.c |
UTS_VERSION |
init/calibrate.c |
calibrate_delay |
init/Makefile |
UTS_VERSION 规则 |
正在加载留言…