大佬教程收集整理的这篇文章主要介绍了linux – 内核构建缓存/非确定性,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
删除构建时间戳后,这适用于我正在构建的确切内核版本.对于上面引用的4.18内核,在CI上构建它会提供以下统计信息:
$ccache -s cache directory priMary config secondary config (readonly) /etc/ccache.conf stats zero time Thu Aug 16 14:36:22 2018 cache hit (direct) 17812 cache hit (preprocessed) 38 cache miss 0 cache hit rate 100.00 % called for link 3 called for preprocessing 29039 unsupported code directive 4 no input file 2207 cleanups performed 0 files in cache 53652 cache size 1.4 GB max cache size 5.0 GB@H_489_23@缓存命中率100%和一小时完成构建,梦幻般的统计数据和预期.
不幸的是,当我尝试构建4.18.1时,我得到了
cache directory priMary config secondary config (readonly) /etc/ccache.conf stats zero time Thu Aug 16 10:36:22 2018 cache hit (direct) 0 cache hit (preprocessed) 233 cache miss 17658 cache hit rate 1.30 % called for link 3 called for preprocessing 29039 unsupported code directive 4 no input file 2207 cleanups performed 0 files in cache 90418 cache size 2.4 GB max cache size 5.0 GB@H_489_23@这是1.30%的命中率,而构建时间反映了这种糟糕的表现.从仅一个补丁版本改变.
我原本预计缓存性能会随着时间的推移而降低,但不会达到这种程度,所以我唯一的想法就是有更多的非确定性而不仅仅是时间戳.例如,大多数/所有源文件是否包括完整的内核版本字符串?我的理解是,像这样的东西会彻底打破缓存.有没有办法让缓存按照我的意愿工作或者不可能?
其中包括精确的内核版本作为宏:
version_h := include/generated/uapi/linux/version.h old_version_h := include/linux/version.h define filechk_version.h (echo \#define LINUX_VERSION_CODE $(sHell \ expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \ echo '#define KERNEL_VERSION(a,b,C) (((a) << 16) + ((b) << 8) + (C))';) endef $(version_h): $(srctreE)/Makefile FORCE $(call filechk,version.h) $(Q)rm -f $(old_version_h)@H_489_23@因此,将生成用于linux 4.16.18的version.h(266258是(4<<< 16)(16<<<< 8)18 = 0x41012)
#define LINUX_VERSION_CODE 266258 #define KERNEL_VERSION(a,C) (((a) << 16) + ((b) << 8) + (C))@H_489_23@稍后,例如在模块构建中,应该有方法来读取LINUX_VERSION_CODE宏值https://www.tldp.org/LDP/lkmpg/2.4/html/lkmpg.html(4.1.6.为多个内核版本编写模块)
如何包含version.h?示例模块包括< linux / kernel.h> < LINUX /&module.h中GT;和< linux / modversions.h>,其中一个文件可能间接包含全局version.h.大多数甚至所有内核源代码都包含version.h.
比较构建时间戳时,可能会重新生成version.h并禁用ccache.当忽略时间戳时,LINUX_VERSION_CODE仅对完全相同的Linux内核版本相同,并且对于下一个补丁级别进行更改.
更新:检查一些内核对象编译的gcc -H输出,会有另一个带有完整内核版本宏定义的头.例如:include / generated / utsrelease.h(UTS_RELEASE宏),include / generated / autoconf.h(CONfig_VERSION_SIGNATURE).
或者甚至在两个补丁级别之间进行相同内核对象编译的gcc -E预处理,并比较生成的文本.使用最简单的linux模块,我直接在gcc命令行中包含./include/linux/kconfig.h,它包含include / generated / autoconf.h(但这在-H输出中不可见,是bug还是功能GCC?).
https://patchwork.kernel.org/patch/9326051/
它实际上是:https://elixir.bootlin.com/linux/v4.16.18/source/Makefile
# Use USERINCLUDE when you must reference the UAPI directories only. USERINCLUDE := \ -I$(srctreE)/arch/$(SRCARCH)/include/uapi \ -I$(objtreE)/arch/$(SRCARCH)/include/generated/uapi \ -I$(srctreE)/include/uapi \ -I$(objtreE)/include/generated/uapi \ -include $(srctreE)/include/linux/kconfig.h # Use LINUXINCLUDE when you must reference the include/ directory. # Needed to be compatible with the O= option LINUXINCLUDE := \ -I$(srctreE)/arch/$(SRCARCH)/include \ -I$(objtreE)/arch/$(SRCARCH)/include/generated \ $(if $(KBUILD_SRC),-I$(srctreE)/includE) \ -I$(objtreE)/include \ $(USERINCLUDE)@H_489_23@LINUXINCLUDE导出到env并在source / scripts / Makefile.lib中用于定义编译器标志https://elixir.bootlin.com/linux/v4.16.18/source/scripts/Makefile.lib
c_flags = -Wp,-MD,$(depfilE) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)@H_489_23@
以上是大佬教程为你收集整理的linux – 内核构建缓存/非确定性全部内容,希望文章能够帮你解决linux – 内核构建缓存/非确定性所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。