减小AOSP内核映像大小

问题描述 投票:0回答:1

我正在尝试构建AOSP内核,但是我无法使生成的boot.img足够小,无法刷新和引导它。它包含带有附加dtb和initramfs的压缩内核。我的意图是使用Syzkaller对驱动程序进行模糊测试。我目前正在使用Pixel XL(马林)。我使用内核分支android-msm-marlin-3.18-pie-qpr3(也尝试了相关的分支),并且正在尝试各种基于gcc的工具链。对于AOSP,我选择了Pie(标记android-9.0.0_r46,构建PQ3A.190801.002)。但是,请注意,这是一个普遍的问题,它不是模糊,内核或设备特定的。

我的要求是:

  • 保留供应商介绍的驱动程序(因为它们是我想要模糊的东西)

  • 启用KASAN和KCOV(及其依赖项)

  • 启用CONFIG_DEBUG_INFO

  • 保持printk

我尝试过的事情和我拥有的想法:

  • Tuning kernel config-这有助于扩展,但这还不够。我已经在使用例如CONFIG_CC_OPTIMIZE_FOR_SIZE=yCONFIG_CORE_SMALL=yCONFIG_NET_SMALL=yCONFIG_KASAN_OUTLINE=yCONFIG_TRIM_UNUSED_KSYMS=yCONFIG_SLOB=y,...

  • 使用xz或lzma压缩内核(和/或initramfs)-这个想法似乎很有希望。我注意到arm64的内核构建系统既不支持xz也不支持lzma(不确定为什么?),所以我亲自对其进行了修补以使其得以构建。构建成功,并且生成的Image.xzkern-dtbImage.lzma-dtb似乎还可以,但是在尝试引导它时(串行调试日志):

[5710] partition_enable_wp: group 0 not defined
[5720] DTB offset is incorrect, kernel image does not have appended DTB
[5720] Device info 0x00000131/00010001/0x00010001/0, pmic 0x20009/0x455013/0x0/0x0
[5740] ERROR: Appended Device Tree Blob not found
[5740] panic (frame 0x83a86848):
...

我已验证存在DTB,并且按预期压缩了内核。我在这里的问题:可能吗? Android引导程序是否甚至支持xz / lzma?我几乎没有在网上找到有关此信息。有什么方法可以使用xz或lzma压缩内核来启动Android吗?

  • 调整启动分区的大小-似乎很困难,但有可能,不确定是否值得尝试。您可以为此推荐任何资源或工具吗?

  • 从initramfs中删除不必要的功能

  • Link-Time Optimization-无论使用什么gcc版本,我都无法使其与AOSP内核一起使用。有提示吗?

  • 将功能构建为模块,而不是内置的-即使尝试仅将单个功能构建为模块(根据配置的不同,编译器或链接器错误),构建也不会通过我尝试的任何配置成功完成。您有任何指南或提示吗?

我还遵循了在AOSP主页(link)上使用KASAN和KCOV构建Pixel内核的教程。我对此有一些问题,但是最终(使用Linaro GCC 5.5.0,进行了一些配置更改,并且没有CONFIG_DEBUG_INFO),我可以将其构建和引导。很好,可以作为概念证明,但不是我需要的,因为我不得不跳过一些必需的功能。

我几乎陷入困境,已经花了几个星期解决这个问题。还有其他选择吗?我很乐意以任何方式启动它。我会很乐意提供任何详细信息和日志,但感觉已经是很长的帖子了。预先非常感谢!

android linux linux-kernel android-source
1个回答
0
投票

我找到了对我有用的解决方案。不过,这是一个近距离的通话,可能不足以适应不同情况。无论如何,它可能会帮助其他人。我基本上使用的是pigz而不是默认的gzip工具,该工具通过-11开关提供了更高的压缩级别。这挤出了我需要的最后一点:结果Image.gz-dtb比以前小了约2.5%。

这些是我对内核构建系统所做的更改(假设pigz在构建时位于您的PATH中:]

diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile
index b7cf2a498c19..7dfd438e997b 100644
--- a/arch/arm64/boot/Makefile
+++ b/arch/arm64/boot/Makefile
@@ -30,7 +30,8 @@ $(obj)/Image: vmlinux FORCE
        $(call if_changed,objcopy)

 $(obj)/Image.gz: $(obj)/Image FORCE                                    
-       $(call if_changed,gzip)                  
+#      $(call if_changed,gzip)
+       $(call if_changed,pigz)

 $(obj)/Image.lz4: $(obj)/Image FORCE  
        $(call if_changed,lz4)
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib                      
index c2b437eb23d5..73d4581f7531 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -272,6 +272,11 @@ quiet_cmd_gzip = GZIP    $@
 cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) || \
        (rm -f $@ ; false)

+
+quiet_cmd_pigz = PIGZ    $@
+cmd_pigz = (cat $(filter-out FORCE,$^) | pigz -n -f -11 > $@) || \
+       (rm -f $@ ; false)
+
 # DTC
 # ---------------------------------------------------------------------------
© www.soinside.com 2019 - 2024. All rights reserved.