LK启动流程详解:从aboot到appsbl

需积分: 23 5 下载量 77 浏览量 更新于2024-09-14 1 收藏 39KB DOC 举报
"本文将详细解析aboot的lk工作流程,着重介绍lk的代码结构以及在启动过程中的关键步骤,包括CPU初始化、平台初始化、定时器及线程创建等环节。lk,即Little Kernel,是appsbl(Applications ARM Boot Loader)的一部分,它作为一个小型内核在启动流程中起到核心作用。" 在Android设备的启动过程中,aboot(应用程序引导加载器)是第一个运行的代码,而LK则是aboot中的核心组件。LK主要负责设备的初期设置,为后续的操作系统加载做好准备。它的代码主要位于`bootable/bootloader/lk`目录下,并按照功能划分为多个子目录。 - `app`: 包含与应用程序相关的代码。 - `arch`: 针对特定架构(如ARM)的代码实现。 - `dev`: 设备驱动程序相关代码。 - `include`: 存放头文件,定义各种接口和数据结构。 - `kernel`: LK系统的核心代码。 - `platform`: 各种硬件平台的特定初始化代码。 - `project`: Makefile文件,用于构建lk。 - `scripts`: Jtag调试脚本。 - `target`: 具体目标板的配置和代码。 LK的启动从`_start`函数开始,该函数在`lk/arch/crt0.S`中定义。`crt0.S`主要负责CPU的基本初始化,然后调用`blkmain`进入C语言代码执行。接下来,`kmain()`函数在`lk/kernel/main.c`中执行,它是LK启动的主要入口点。 在`kmain()`函数中,LK执行以下关键步骤: 1. 初始化线程结构体,为后续进程管理做准备:`thread_init_early()` 2. 进行ARM架构相关的初始化,如关闭缓存和启用MMU:`arch_early_init()` 3. 平台的早期初始化,根据设备特性进行定制:`platform_early_init()` 4. 板级初始化,如初始化串口(UART):`target_early_init()` 5. 调用构造函数进行系统组件的初始化:`call_constructors()` 6. 初始化内存堆:`heap_init()` 7. 初始化线程对象,创建调度器的基础:`thread_init()` 8. 初始化延迟处理程序(DPC):`dpc_init()` 9. 初始化定时器系统:`timer_init()` 10. 创建并恢复一个名为"bootstrap2"的新线程,执行boot加载的后续任务:`thread_resume(thread_create("bootstrap2",&bootstrap2,NULL,DEFAULT_PRIORITY,DEFAULT_STACK_SIZE))` `bootstrap2`函数是启动流程的重点,它会继续完成系统的加载和初始化过程,最终引导到更高级别的引导加载器或操作系统内核。 aboot的lk工作流程涉及了从硬件初始化到操作系统加载的多个层次,通过精心设计的代码结构和步骤,确保设备能够顺利进入操作系统环境。了解lk的工作原理对于系统开发者来说至关重要,有助于优化启动性能和解决启动相关的问题。