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函数创建线程启动

相关推荐
ElfBoard25 分钟前
飞凌精灵(ElfBoard)技术贴|如何在RK3506开发板上实现UART功能复用
大数据·linux·人工智能·驱动开发·单片机·嵌入式硬件·物联网
HackTorjan34 分钟前
AI驱动的制品库高效管理:智能分类、自动化追踪与全生命周期优化
linux·人工智能·分类·自动化
.千余39 分钟前
【Linux】进程概念
linux·服务器·开发语言·学习
蜡台42 分钟前
centos 8 安装 nginx-1.29.8 及相关配置教程
linux·nginx·centos
爱学习的小囧43 分钟前
ESXi性能历史怎么监控?2种方法,图形化+命令行全覆盖
java·linux·运维·服务器·网络·esxi·esxi8.0
sagima_sdu1 小时前
Codex 使用指南(技术向):App、CLI 与工作流接入
linux·运维·语言模型·json
圆山猫1 小时前
[Linux] 用 Buildroot 为 RISC-V QEMU 构建最小根文件系统
linux·运维·risc-v
小草儿7992 小时前
gbase8s之onatpe备份与恢复性能测试
linux·服务器·网络
不做无法实现的梦~2 小时前
Linux 嵌入式开发完整入门:工具、配置和学习路线
linux·运维·学习
摘星台2 小时前
linux环境对stm32单片机进行程序烧录
linux·stm32·单片机