高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel)。高通UEFI由XBL和ABL两部分组成。XBL负责芯片驱动及充电等核心应用功能。ABL包括芯片无关的应用如fastboot。XBL核心是none-HLOS boot_image代码的一部分,属于高通私有代码。ABL则在开源Linux Android代码树里。LK的设备驱动都放在了XBL核心,Linux加载启动及fastboot等功能组件则作为独立的UEFI应用存在。有关UEFI、XBL及ABL的详细介绍,请参见高通文档《80_P2484_37_LINUX_ANDROID_UEFI_OVERVIEW.pdf》。
ABL的编译非常简单,依次执行命令source build/envsetup.sh、lunch 32、make aboot,即可在out目录下生成abl.elf。这次调试ABL主要碰到了两个问题,一是没有生成abl.elf,二是生成abl.elf后没有做签名。高通原生代码并不存在问题,是项目中修改了代码导致的。费了一番周折,最终成功编译出可正常工作的abl.elf。未签名的abl.elf大概98KB,签名后的abl.elf约108KB。需要注意的是,ABL在Android代码树下,而签名工具(secimage)在高通私有代码目录(vendor/qcom/proprietary)下,在编译ABL时,一定要将高通提供的私有代码全部放到相应的目录下。未签名的abl.elf会让系统无法启动,上电直接进入EDL紧急下载模式。
这次调试ABL还是为了解决误入FFBM的问题。之前是通过修改init来解决的,即在设置系统Property时忽略内核命令行参数中的ffbm模式。而修改ABL则是打算在读取misc分区时做处理,直接不生成内核命令行参数的相应配置项。注释掉BootLinux.c中GetFfbmCommand的相关代码,具体如下,
烧录经过签名的abl.elf到abl分区,并将misc分区内容写为ffbm,重启机器,系统果然可以正常进入Android,并且内核命令行参数也无androidboot.mode=ffbm项,达到预期目的,详细如下图所示。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!