Android 减少AOSP内核映像大小
我正在尝试构建一个AOSP内核,但我无法使生成的Android 减少AOSP内核映像大小,android,linux,linux-kernel,android-source,Android,Linux,Linux Kernel,Android Source,我正在尝试构建一个AOSP内核,但我无法使生成的boot.img小到足以闪存和引导它。它包含带有附加DTB和initramfs的压缩内核。我的意图是使用模糊测试驱动程序。我目前正在使用像素XL(马林)。我使用内核分支android-msm-marlin-3.18-pie-qpr3(也尝试了相关的分支),并尝试各种基于gcc的工具链。对于AOSP,我选择了Pie(标签android-9.0.0\uR46,构建PQ3A.190801.002)。但是,请注意,这是一个一般性的问题,它不是模糊的、内核的
boot.img
小到足以闪存和引导它。它包含带有附加DTB和initramfs的压缩内核。我的意图是使用模糊测试驱动程序。我目前正在使用像素XL(马林)。我使用内核分支android-msm-marlin-3.18-pie-qpr3
(也尝试了相关的分支),并尝试各种基于gcc的工具链。对于AOSP,我选择了Pie(标签android-9.0.0\uR46
,构建PQ3A.190801.002
)。但是,请注意,这是一个一般性的问题,它不是模糊的、内核的或特定于设备的
我的要求是:
- 保持供应商介绍的驱动程序(因为它们是我想要模糊的)
- 启用KASAN和KCOV(及其依赖项)
- 启用
CONFIG\u DEBUG\u INFO
- 保持
等printk
- 调整内核配置-这在某种程度上有所帮助,但还不够。例如,我已经在使用
,CONFIG\u CC\u OPTIMIZE\u for_SIZE=y
,CONFIG\u CORE\u SMALL=y
,CONFIG\u NET\u SMALL=y
,CONFIG\u KASAN\u OUTLINE=y
,CONFIG\u TRIM\u UNUSED\u KSYMS=y
CONFIG\u SLOB=y
- 使用xz或lzma压缩内核(和/或initramfs)-这个想法似乎很有希望。我注意到arm64的内核构建系统既不支持xz,也不支持现成的lzma(不知道为什么?),所以我自己修补了它以构建它。生成成功,生成的
或Image.xzkern dtb
似乎正常,但在尝试启动时(串行调试日志):Image.lzma dtb
- 调整启动分区的大小-这似乎很难,但可能,不确定是否值得尝试。你能为此推荐一些资源或工具吗
- 从initramfs中删除不必要的功能
- 链接时间优化-无论我使用什么gcc版本,我都无法让它与AOSP内核一起工作。有什么建议吗
- 将功能构建为模块而不是内置的-即使仅将单个功能构建为模块(不同的编译器或链接器错误取决于配置),我尝试的任何配置都不会成功构建功能。你有什么指导或提示吗
config\u DEBUG\u INFO
)我可以构建并启动它。很好的概念证明,但不是我需要的,因为我不得不跳过一些必需的功能
我已经被困在这个问题上好几个星期了。还有其他选择吗?我很乐意让它以任何方式启动。我很乐意提供任何细节和日志,但感觉这已经是一篇很长的文章了。提前非常感谢 我找到了一个适合我的解决方案。这是一个千钧一发的机会,但可能没有足够的大小减少不同的情况。不管怎样,它可能会帮助别人 我使用的不是默认的
gzip
工具,它通过-11
开关提供了更高的压缩级别。使用-i45
增加优化迭代次数进一步改进了它(默认值为15)。这就挤出了我需要的最后一位:得到的Image.gz dtb
比以前小了大约2.5%
这些是我对内核构建系统所做的更改(假设构建时pigz
将在路径中):
它会闪烁,启动良好,甚至在合理的时间内启动,这与我以前的情况相反。您的尺码和目标是什么?是否确实已从模块中删除调试信息?如果不这样做,通常需要100兆字节。为什么不能在一台功能强大的x86服务器上的虚拟环境中进行简单的模糊处理呢?我已经接近34兆字节了,限制是32兆字节。我没有从模块中删除调试信息,因为当我模糊它们并检测崩溃或其他问题时,我需要有用的堆栈跟踪等调试信息。如果我使用仿真器并因此为goldfish平台构建,我感兴趣的特定于供应商的驱动程序将被忽略(因为没有相应的硬件)但是我正在考虑只在我正在模糊化的一些模块中有选择地保留调试信息,然后构建另一个内核来模糊化其他模块等。这可能是一个可行的解决办法,但是一个干净的解决方案会更好
[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):
...
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
# ---------------------------------------------------------------------------