如何在两个Linux模块之间共享代码?

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

我收到了一个专有的Linux驱动的代码,它的结构如下。

common/common.c
moduleA/Makefile
moduleB/Makefile

问题是模块A和模块B中都包含了以下语句 moduleX-objs += ../common/common.o. 这显然是很狂暴的,因为在进行多线程编译时,两个线程同时对文件commoncommon.o进行读写。

有什么干净的方法可以解决这个问题?建立一个单独的模块common.ko?内核构建系统的标准方法是什么?

c makefile linux-kernel gnu-make kernel-module
1个回答
2
投票

模块依赖于common.o

一种方法是在构建模块之前先构建common.o,把common.o作为模块的先决条件,因为两个模块都会认为common.o是最新的,不过如果用--always-make构建的话,还是会有一个竞赛条件,因为那时模块不会检查日期。你可以通过在模块构建过程中把common设为只读的方式来防止这种情况的发生,这样可以避免任何--always-make的尝试(假设模块的makefile没有覆盖权限,这将是一件很奇怪的事情)。不过你必须跟踪模块使用的常用内容。简单的解决方案,最好的性能。

所有模块都依赖于一个模块

如果你觉得自己很懒,你可以在模块之间做一个虚假的依赖关系,比如所有模块都依赖模块A。所有模块都会被多线程构建,但所有模块所依赖的模块不会和其他模块同时构建。确实会有构建性能的下降,但我希望在大多数情况下它是微不足道的。为了获得更好的性能,你可以尝试依赖构建时间短的模块或高效的内部多线程。最简单的解决方案,性能良好。不能和--always-make一起使用,请使用前面提到的只读策略。

分离的源代码树

我曾成功地将模块和通用文件复制到单独的(构建)文件夹中,然后从那里进行构建,但这使其他事情变得复杂,而且如果模块包含很多文件,构建性能可能会降低。如果你决定这样做,记得要复制成硬链接。cp -lr. 最简单的解决方案(其中我提到的)。值得注意的是,模块可能想用不同的构建标志来构建共同的,在这种情况下,你需要为每个模块单独的.o-files。如果是这样的话,这个解决方案将在其他方案无法解决的地方发挥作用。

以上是我长期以来学习的设计。并不是说这是最先进的设计。

© www.soinside.com 2019 - 2024. All rights reserved.