MT6765启动流程深度解析:从芯片上电到Android系统前的关键旅程
每次按下手机电源键,到熟悉的Logo亮起,这短短几秒内,芯片内部究竟上演了怎样一场精密复杂的“交响乐”?对于嵌入式开发者,尤其是深耕MTK平台的工程师而言,理解这段从“无”到“有”的启动过程,不仅是调试系统、解决疑难杂症的基础,更是进行深度定制和性能优化的钥匙。今天,我们就以MT6765这颗在入门到中端市场广泛应用的芯片为例,结合Android 10的代码实践,深入剖析从Preloader到Little Kernel(LK)的完整初始化流程。这不仅仅是技术文档的罗列,更是我结合多次项目调试经验,为你梳理出的一条清晰、可操作的认知路径。
1. 启动序幕:ARM架构与MT6765的启动舞台
在深入代码细节之前,我们必须先搭建好认知的舞台——理解ARMv8-A架构的异常等级(Exception Level, EL)和MT6765的硬件启动设计。这决定了后续所有软件行为的“游戏规则”。
ARMv8-A架构定义了从EL0到EL3四个异常等级,权限逐级升高。在典型的移动设备场景中:
- EL3 (Secure Monitor):最高特权级,运行诸如ARM Trusted Firmware(ATF)这样的安全监控代码。这是硬件安全信任根的起点。
- EL2 (Hypervisor):可选,用于运行虚拟化管理程序。
- EL1 (OS Kernel):操作系统内核(如Linux Kernel)和引导加载程序第二阶段(如LK/U-Boot)的运行层级。
- EL0 (Applications):用户应用程序的运行层级。
MT6765的启动流程严格遵循这一架构。但软件不会凭空运行,硬件提供了最初的“火种”——Boot ROM。这是一段固化在芯片内部的只读存储器代码,是设备上电后第一个执行的指令。它的任务非常明确且关键:
- 初始化最基础的CPU和系统时钟。
- 检测启动模式:是通过USB下载(Download Mode)还是从存储设备(如eMMC)正常启动。
- 加载Preloader:从指定的启动设备(由efuse或GPIO配置决定)的固定位置,将Preloader镜像加载到芯片内部的ISRAM(Internal Static RAM)中。之所以用ISRAM,是因为此时外部DRAM尚未初始化,无法使用。
注意:Boot ROM的代码是芯片厂商固化的,开发者无法修改。它的可靠性和安全性是整个系统信任链的基石。
理解了这个硬件与架构的基础,我们就能明白,Preloader作为软件启动流程的第一棒,是在一个非常受限的环境下(ISRAM中,无DRAM)开始工作的。它的使命,就是为后续更复杂的软件创造一个最基本的运行环境。
2. Preloader核心任务拆解:从汇编入口到硬件初始化
Preloader的代码通常由汇编启动文件和C语言主函数构成。我们以MTK平台典型的代码结构为例,看看它是如何一步步搭建起这个“临时舞台”的。
2.1 启动入口与最低限度的环境搭建
一切始于链接脚本 link_descriptor.ld,它定义了程序的入口点 _start。这个符号在 init.S 汇编文件中实现:
// vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6765/src/init/init.S
.globl _start
_start:
b resethandler // 跳转到复位处理程序
// ... 其他异常向量 ...
在 resethandler 中,会执行一系列经典的底层初始化操作,我们可以用以下列表来概括其核心步骤:
- 设置处理器模式:将CPU切换到SVC(Supervisor)模式,这是一个具有较高权限的模式,适合进行系统初始

&spm=1001.2101.3001.5002&articleId=153499756&d=1&t=3&u=7aecaef0e9b64754831d4da92cf3b49f)
371

被折叠的 条评论
为什么被折叠?



