LK(little kernel)2:官方LK的通用启动流程

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],功能如下:

  1. 保存启动参数 :将传入的四个参数存储到全局数组lk_boot_args中。
  2. 早期初始化:依次调用架构、平台和目标板相关的早期初始化函数。
  3. 打印欢迎信息:根据是否支持SMP(多核)打印不同欢迎信息,并输出启动参数。
  4. 堆和内核初始化:初始化内核堆、调用静态构造函数、完成内核初始化。
  5. 创建引导线程:创建并启动一个用于完成系统初始化的线程。
  6. 进入空闲状态:当前CPU成为idle线程,启用中断以启动调度器。

整体流程是从硬件初始化到系统运行环境搭建的核心启动逻辑。

在该函数中最终是初始化并进入bootstrap2线程进行第二段初始化过程,同时当前线程变为 idle 线程,调度器开始工作

bootstrap2函数

这段代码是系统启动过程中的一个关键初始化函数 bootstrap2

文件路径如下:top\main.c

主要功能如下:

  1. 条件编译处理 Rust 支持 :若启用 Rust,则调用 must_link_rust() 确保链接相关符号。
  2. 分层初始化系统组件:依次初始化线程、架构、平台、目标和应用程序相关模块,每层通过 [lk_primary_cpu_init_level](file://d:\Github_Sh\lk\top\include\lk\init.h#L110-L112) 控制初始化顺序。
  3. 完成初始化:最终调用 [lk_primary_cpu_init_level] 标记所有层级初始化完毕。

该函数调用 apps_init(),扫描并启动所有注册的 LK 应用。

apps_init函数

这段代码的功能是初始化并启动应用程序,文件路径如下:app\app.c

  1. 初始化应用:遍历所有应用描述符,调用每个应用的 [init]函数。
  2. 自动启动应用 :再次遍历应用描述符,对未设置 [APP_FLAG_NO_AUTOSTART] 标志且有入口函数 ([entry] 的应用,调用 start_app 启动。

核心逻辑通过 __start_apps__stop_apps 界定应用描述符范围。

最终会将所有的应用程序通过start_app函数创建线程启动

相关推荐
xlp666hub1 天前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
张宏2361 天前
原子操作 (基于Linux 应用层 C 语言)
linux
kymjs张涛2 天前
OpenClaw 学习小组:初识
android·linux·人工智能
程序设计实验室2 天前
经历分享,发现挖矿木马后,服务器快速备份与重装(腾讯云平台)
linux
Miku162 天前
OpenClaw-Linux+飞书官方Plugin安装指南
linux·人工智能·agent
Miku162 天前
OpenClaw 接入 QQ Bot 完整实践指南
linux·人工智能·agent
Yogurt_cry2 天前
[树莓派4B] 闲置近10年的爱普生 L310 打印机爆改无线打印机
linux·物联网·树莓派
Johny_Zhao3 天前
OpenClaw中级到高级教程
linux·人工智能·信息安全·kubernetes·云计算·yum源·系统运维·openclaw
Sheffield4 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield4 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器