LK启动流程详解:从aboot到appsbl
需积分: 23 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的工作原理对于系统开发者来说至关重要,有助于优化启动性能和解决启动相关的问题。
457 浏览量
273 浏览量
1575 浏览量
1271 浏览量
396 浏览量
474 浏览量
chason_cai
- 粉丝: 2
- 资源: 1
最新资源
- 一个帮助实现条形码扫描的库-Android开发
- casile:CaSILE工具包,采用SILE和其他向导的图书出版工作流程
- TextureSwiftSupport:一个使我们获得DSL来在Texture中定义布局规范的库[如SwiftUI]
- 高端大气星级酒店展示网站静态模板.zip
- PING-开源
- 雷达成像中的时频分析成像
- WebRtcAecmSample:这是一个aecm示例(使用webrtc)
- bluetooth.rar_android 蓝牙_android bluetooth_android蓝牙_蓝牙_蓝牙通信
- area_of_a_regular_polygon
- LibraryPractice_20210327
- ruby-on-rails-cassandra:Ruby on Rails与Cassandra
- 泛型MakeGeneric方法应用实例.rar
- 影刀RPA系列公开课3:网页自动化——数据抓取.rar
- formation_control-master.zip_formation control_formation_control
- matlab标注字体代码-MATLAB-Tools:为MATLAB生成的一组脚本,这些脚本可能在您自己的项目和文件中有用
- flex-masonry:用CodeSandbox创建