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

相关推荐
_OP_CHEN2 小时前
【Linux系统编程】(三十四)初识进程信号:Linux 软中断的核心奥秘
linux·后端·操作系统·进程·信号·终端信号
盟接之桥2 小时前
盟接之桥说制造:制造业的精致之道,致制造人
大数据·linux·运维·人工智能·windows·安全·制造
夏乌_Wx2 小时前
从零开始实现一个自己的 Shell:mybash 项目实战
linux·c语言·后端
Codefengfeng11 小时前
CTF工具篇
linux·运维·服务器
上海合宙LuatOS12 小时前
LuatOS核心库API——【i2c】I2C 操作
linux·运维·单片机·嵌入式硬件·物联网·计算机外设·硬件工程
一文解千机14 小时前
wine 优化配置及显卡加速,完美运行Electron 编译的程序(新榜小豆芽、作家助手、小V猫等)
linux·ubuntu·electron·wine·wine优化配置·wine显卡加速·wine大型游戏
2401_8582861115 小时前
OS53.【Linux】System V 共享内存(2)
linux·运维·服务器·共享内存
能源革命19 小时前
Ubuntu_24.04 安装OpenClaw教程
linux·ubuntu