init_task、版本与校准机制与实现详解

init_task、版本与校准机制与实现详解

源码路径rk3588/kernel-6.1/init/init_task.cversion.ccalibrate.cMakefile
内核版本:Linux 6.1(RK3588 / ARM64)
文档目录linuxDoc/init/


目录


一、原理

1.1 init_task

内核启动时 当前任务init_taskrest_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_taskPF_KTHREAD 起始,栈为 init_stack
  • CONFIG_THREAD_INFO_IN_TASK:thread_info 嵌入 task_struct
  • CONFIG_SHADOW_CALL_STACK:SCS 栈魔数

新进程通过 copy_process 继承/调整这些字段;不要随意改 init_task 布局(架构依赖)。

2.2 版本构建(Makefile + version.c

  1. 编译 version.o 时使用临时 utsversion-tmp.hUTS_VERSION 截断 64 字节)
  2. 最终 version-timestamp.o 使用 include/generated/utsversion.h
  3. 标志位:SMPPREEMPTPREEMPT_DYNAMICPREEMPT_RT
  4. build-version 脚本:可被 KBUILD_BUILD_VERSION 覆盖

2.3 calibrate.c

  • calibrate_delay():在 start_kernelsched_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_SMPUTS_VERSIONSMP 标记
  • 产品版本号常在 Android/BSP 构建脚本KBUILD_BUILD_VERSION,而非改 init_task.c
  • lpj= 在极慢串口调试时可用于 缩短 start_kernel 尾部耗时(少见)

五、调试与观测

1
2
uname -a
cat /proc/version
说明
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 规则

相关01 start_kernel

文章互动

阅读 --

留言

0 条留言

正在加载留言…