android - 减小 AOSP 内核映像大小
问题描述
我正在尝试构建一个 AOSP 内核,但我无法使生成的内核boot.img
小到足以闪存和启动它。它包含带有附加 dtbs 和 initramfs 的压缩内核。我的目的是使用Syzkaller对驱动程序进行模糊测试。我目前正在使用 Pixel XL (marlin)。我使用内核分支android-msm-marlin-3.18-pie-qpr3
(也尝试过相关的分支),并且正在尝试各种基于 gcc 的工具链。对于 AOSP,我选择了 Pie(标签android-9.0.0_r46
、构建PQ3A.190801.002
)。但是,请注意这是一个普遍的问题,它不是模糊测试、内核或设备特定的。
我的要求是:
保留供应商引入的驱动程序(因为它们是我想要模糊的)
启用 KASAN 和 KCOV(及其依赖项)
使能够
CONFIG_DEBUG_INFO
保持
printk
之类的
我尝试过的事情和我的想法:
调整内核配置——这在一定程度上有所帮助,但这还不够。我已经在使用例如
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
,CONFIG_CORE_SMALL=y
,CONFIG_NET_SMALL=y
,CONFIG_KASAN_OUTLINE=y
,CONFIG_TRIM_UNUSED_KSYMS=y
,CONFIG_SLOB=y
, ...使用 xz 或 lzma 压缩内核(和/或 initramfs) ——这个想法似乎很有希望。我注意到 arm64 的内核构建系统既不支持开箱即用的 xz 也不支持 lzma(不知道为什么?),所以我自己修补了它来构建它。构建成功并且结果
Image.xzkern-dtb
或Image.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 中删除不必要的功能
链接时间优化- 无论我使用什么 gcc 版本,我都无法让它与 AOSP 内核一起工作。有小费吗?
将功能构建为模块而不是内置- 我尝试的任何配置都不会成功构建,即使仅将单个功能构建为模块(根据配置不同编译器或链接器错误)。您有任何指南或提示吗?
我还按照 AOSP 主页(链接)上关于使用 KASAN 和 KCOV 构建像素内核的教程进行操作。我遇到了一些问题,但最终(使用 Linaro GCC 5.5.0,进行了一些配置更改而没有CONFIG_DEBUG_INFO
)我可以构建和启动它。作为概念验证很好,但不是我需要的,因为我不得不跳过一些必需的功能。
我几乎陷入了困境,并且已经在这个问题上花了几个星期。还有其他选择吗?我很乐意以任何方式启动它。我很乐意提供任何细节和日志,但感觉这已经是一篇很长的帖子了。非常感谢您!
解决方案
我找到了一个适合我的解决方案。不过,这是一个很接近的电话,对于不同的情况可能还不足以减小尺寸。无论如何,它可能会帮助其他人。
我使用pigz而不是默认工具,它通过开关gzip
提供了更高的压缩级别。-11
通过进一步改进来增加优化迭代的次数-I 45
(默认为 15)。这挤出了我需要的最后一点:结果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 -I 45 > $@) || \
+ (rm -f $@ ; false)
+
# DTC
# ---------------------------------------------------------------------------
它闪烁并启动良好,甚至在合理的时间内启动,与我之前的情况相反。
推荐阅读
- r - R:如何在 ggplot 字幕中将 2019-04-29 显示为 2019 年 5 月 29 日?
- macos - 模拟器无法在 Mac OS 10.11.16 中启动,需要 Mac OS 10.12 或更高版本
- selenium - 选择/单击单选按钮后,在“goo.gl/RVdKM9”处,状态仍然为假
- azure - 如何使用 Azure FaceAPI 通过 faceId 或 thumbnailId 获取性别和年龄
- python-3.x - 如何使用 SQLAlchemy 配置 Flask-Session 以在服务器端存储 Flask 会话
- python - 使用子进程调用时应用程序没有响应
- java - 如何使用 ASCII 符号绘制图像?
- .net-core - 有关通过 Azure AD B2C 和 dotnetcore 对 Bot Framework 用户进行身份验证的任何建议/示例?
- r - 绘制自举置信区间
- node.js - Node & Express - 从更高的目录访问文件