高通在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》。android
ABL的编译很是简单,依次执行命令source build/envsetup.sh、lunch 3二、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的相关代码,具体以下,ui
烧录通过签名的abl.elf到abl分区,并将misc分区内容写为ffbm,重启机器,系统果真能够正常进入Android,而且内核命令行参数也无androidboot.mode=ffbm项,达到预期目的,详细以下图所示。spa