Android Kernel - Boot Loader

本文详细解析了Android Bootloader的核心组件LK(Little Kernel)的主要代码流程,包括kmain函数、线程初始化、架构早期初始化、平台初始化、定时器初始化等关键步骤。通过阅读源代码,介绍了内存管理、中断处理、调试机制、设备初始化等方面的知识,为理解Android启动流程提供了深入的洞察。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Android Boot loader 的 code 在 bootable/bootloader/lk 底下, LK 是 Little Kernel 的缩写, 是 andriod bootloader 的核心精神.

 

入口函数在 kernel/main.c 中的 kmain(), 以下就来读读这一段 code.

 

 

 

In include/debug.h: 我们可以看到 dprintf 的第一个参数是代表 debug level.

 

 

 

In include/debug.h: 

 

 

 

所以 dprintf 会依 DEBUGLEVEL 来判断是否输出信息.

 

来看第一个 call 的函数: thread_init_early, define in thread.c

 

 

 

#define NUM_PRIORITIES 32 in include/kernel/thread.h

 

list_initialize() defined in include/list.h: initialized a list

 

 

 

run_queue 是 static struct list_node run_queue[NUM_PRIORITIES]

 

thread_list 是 static struct list_node thread_list

 

再来要 call  的函数是: arch_early_init() defined in arch/arm/arch.c

 

 

 

现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,

 

内存管理单元)提供支持。

 

CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地

 

址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA

 

MMU将VA映射到PA是以页(Page)为单位的,32位处理器的页尺寸通常是4KB。例如,MMU可以通过一个映射项将VA的一页

 

0xb7001000~0xb7001fff映射到PA的一页0x2000~0x2fff,如果CPU执行单元要访问虚拟地址0xb7001008&

<think>好的,我现在需要回答用户关于pre-loader、LK、kernelAndroid初始化是否都保存在UFS的boot分区中的问题。首先,我要确认这些组件在启动流程中的位置以及它们通常存储的位置。 用户之前问过mt_boot文件夹,现在转向UFS的boot区域。我需要明确UFS(通用闪存存储)的结构,以及不同启动阶段组件的位置。 首先,pre-loader通常是联发科芯片设备中的底层引导程序,负责初始化最基本的硬件,比如DRAM和时钟。它可能存放在preloader分区或者boot ROM中,而不是标准的boot分区。但用户提到的是UFS的boot区域,这里可能需要区分不同的存储分区。 然后是LK(Little Kernel),作为引导加载程序,比如用于Android的fastboot模式。LK通常存放在boot分区或者独立的lk分区中,但具体要看设备的分区表。 Kernel(Linux内核)通常确实存放在boot分区,这是Android设备的标准做法,所以用户提到的boot区域应该包含内核。 Android初始化涉及initramfs或init进程,这部分通常包含在boot分区的ramdisk中,所以也是boot分区的一部分。 接下来需要确认是否所有这四个部分都位于同一个UFS的boot分区。可能需要指出pre-loader可能不在其中,而是存放在独立分区或boot ROM,而LK、kernel和初始化相关文件在boot分区。同时,不同厂商可能有不同的分区布局,比如有些设备可能将LK放在recovery分区或者单独的分区。 需要确保回答准确,避免错误,比如pre-loader的位置可能因设备而异。此外,UFS的分区结构可能包括多个启动相关分区,如boot、recovery、lk、preloader等,所以不能一概而论全部在boot分区。 还要考虑用户可能的混淆点,比如将UFS的boot区域等同于整个启动流程的存储位置,而实际上启动流程可能涉及多个分区。需要解释每个组件的典型存储位置,并指出可能的例外情况。 最后,总结时要明确哪些通常存放在boot分区,哪些可能在其他分区,并建议具体设备具体分析,可能需要查看分区表或官方文档。</think>在基于 **UFS(通用闪存存储)** 的 Android 设备中,启动流程涉及多个关键组件,包括 `pre-loader`、`LK`(Little Kernel)、`Kernel` 和 Android 初始化系统。它们的存储位置与设备的分区设计密切相关,但并非全部位于 **UFS 的 `boot` 分区**。以下是对各组件存储位置及作用的详细说明: --- ### **1. 各组件的作用与存储位置** | 组件 | 功能描述 | 典型存储位置 | |-------------------|--------------------------------------------------------------------------|---------------------------------------| | **Pre-loader** | 联发科(MTK)芯片特有的底层引导程序,初始化 DRAM、时钟等基础硬件。 | **`preloader` 分区** 或 Boot ROM | | **LK (Little Kernel)** | 二级引导加载程序(如 Fastboot),负责加载内核并传递启动参数。 | **`lk` 分区** 或 `boot` 分区 | | **Kernel** | Linux 内核,驱动硬件并启动用户空间(Android)。 | **`boot` 分区** 或 `kernel` 分区 | | **Android 初始化** | 包含 `init` 进程、`initramfs`(初始内存文件系统)和启动脚本。 | `boot` 分区的 **ramdisk** 中 | --- ### **2. UFS 的 `boot` 分区内容** - **典型包含**: - **Kernel 镜像**(如 `Image.gz-dtb`)。 - **Ramdisk**(含 `init` 进程、启动脚本、基础驱动模块)。 - **设备树二进制(DTB)**(描述硬件布局)。 - **不包含**: - `pre-loader`(通常位于独立分区或固化在芯片 Boot ROM 中)。 - `LK`(可能存储在 `lk` 分区或与 `boot` 分区合并,因厂商而异)。 --- ### **3. 启动流程与分区交互** 1. **Pre-loader** - 从 **`preloader` 分区** 或芯片内部 ROM 加载,初始化关键硬件。 - 移交控制权给 **LK**。 2. **LK (Little Kernel)** - 从 **`lk` 分区** 加载,验证并启动 `boot` 分区的内核。 - 部分设备将 LK 嵌入 `boot` 分区头部(如高通设备)。 3. **KernelAndroid 初始化** - 从 `boot` 分区加载内核和 `initramfs`。 - 内核挂载根文件系统,启动 `init` 进程,完成 Android 用户空间初始化。 --- ### **4. 不同厂商的分区差异** - **联发科(MTK)设备**: - `pre-loader` 独立分区,`LK` 可能集成在 `boot` 分区或 `lk` 分区。 - 分区命名示例:`preloader`、`lk`、`boot`。 - **高通(Qualcomm)设备**: - 使用 `aboot`(类似 LK)作为引导加载程序,通常存储在 `aboot` 分区。 - `boot` 分区包含内核和 ramdisk。 --- ### **5. 关键注意事项** - **分区命名非统一性**: 不同厂商可能对分区命名和布局进行定制(例如华为的 `kernel` 和 `ramdisk` 分拆)。 - **安全启动(Secure Boot)**: `pre-loader` 和 `LK` 可能包含签名验证逻辑,防止未授权修改。 - **调试与备份**: - 通过 `fastboot getvar all` 可查看设备分区表。 - 修改 `boot` 分区需解锁 Bootloader,否则会导致启动失败。 --- ### **6. 示例:UFS 启动相关分区** ``` # 联发科设备典型分区(通过 `ls -l /dev/block/bootdevice/by-name` 查看) preloader --> /dev/block/sda1 lk --> /dev/block/sda2 boot --> /dev/block/sda3 system --> /dev/block/sda4 ``` --- ### **总结** - **`boot` 分区**:主要存储 **Kernel** 和 **Android 初始化文件**(ramdisk)。 - **`pre-loader` 和 `LK`**:通常位于独立分区,不直接归属 `boot` 分区。 - **具体存储位置需结合设备厂商的分区表确认**,可通过刷机工具(如 SP Flash Tool)或终端命令(需 root)查看。 如果需要进一步分析特定设备,请提供分区表或机型信息!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值