LK(little kernel)2:官方LK的通用启动流程
LK(Little Kernel)是一个轻量级嵌入式内核,常用于 Bootloader(如 Android 设备的 Bootloader)。
LK 启动分为 5 个核心阶段,从汇编级最小初始化逐步过渡到 C 语言内核与应用:
硬件复位
→ 汇编阶段(_start)
→ 架构初始化(arch_init)
→ 平台初始化(platform_init)
→内核初始化(kernel_init)
→ 应用启动(app)
一、链接脚本入口-system-onesegment.ld
LK 的启动入口由链接脚本指定,链接脚本(如 arch/arm/system-onesegment.ld)

该脚本主要用于内核或裸机程序的链接阶段,控制各段在内存中的位置和对齐方式。
c
主要功能包括:
输出格式与架构:指定生成ELF格式的ARM架构可执行文件。
入口点:设置程序入口为_start。
段分配:
.text:存放代码和只读数据,加载到物理地址%MEMBASE% + %KERNEL_LOAD_OFFSET%。
.rodata:只读数据段,包含异常处理表等。
.data:初始化的可写数据。
.bss:未初始化数据段。
符号定义:定义关键地址符号(如__bss_start、_end),便于运行时使用。
内存检查:确保程序大小不超过RAM区域。
清理无用段:丢弃调试信息等无关内容。
该链接脚本执行完毕后最,会进入程序入口_start

该函数的文件路径为:arch\arm\arm\start.S
这段代码定义了程序的入口点 _start,并初始化了异常向量表,具体内容如图所示:

在该初始化函数中,最终通过汇编语言bl 跳转到主函数入口lk_main

函数入口-lk_main
经过汇编语言的跳转最终跳转到C语言中的函数入口lk_main
文件路径如下:top\main.c
(不同版本的main.c的路径一样,比如有的main.c是在kernel目录下)

这段代码是LK(Little Kernel)操作系统的主入口函数[lk_main],功能如下:
- 保存启动参数 :将传入的四个参数存储到全局数组
lk_boot_args中。 - 早期初始化:依次调用架构、平台和目标板相关的早期初始化函数。
- 打印欢迎信息:根据是否支持SMP(多核)打印不同欢迎信息,并输出启动参数。
- 堆和内核初始化:初始化内核堆、调用静态构造函数、完成内核初始化。
- 创建引导线程:创建并启动一个用于完成系统初始化的线程。
- 进入空闲状态:当前CPU成为idle线程,启用中断以启动调度器。
整体流程是从硬件初始化到系统运行环境搭建的核心启动逻辑。
在该函数中最终是初始化并进入bootstrap2线程进行第二段初始化过程,同时当前线程变为 idle 线程,调度器开始工作

bootstrap2函数
这段代码是系统启动过程中的一个关键初始化函数 bootstrap2,
文件路径如下:top\main.c
主要功能如下:
- 条件编译处理 Rust 支持 :若启用 Rust,则调用
must_link_rust()确保链接相关符号。 - 分层初始化系统组件:依次初始化线程、架构、平台、目标和应用程序相关模块,每层通过 [lk_primary_cpu_init_level](file://d:\Github_Sh\lk\top\include\lk\init.h#L110-L112) 控制初始化顺序。
- 完成初始化:最终调用 [lk_primary_cpu_init_level] 标记所有层级初始化完毕。
该函数调用 apps_init(),扫描并启动所有注册的 LK 应用。
apps_init函数
这段代码的功能是初始化并启动应用程序,文件路径如下:app\app.c

- 初始化应用:遍历所有应用描述符,调用每个应用的 [init]函数。
- 自动启动应用 :再次遍历应用描述符,对未设置 [APP_FLAG_NO_AUTOSTART] 标志且有入口函数 ([entry] 的应用,调用
start_app启动。
核心逻辑通过 __start_apps 和 __stop_apps 界定应用描述符范围。
最终会将所有的应用程序通过start_app函数创建线程启动

