如何在 Linux 内核构建期间生成可加载模块?

How do I generate loadable modules during Linux kernel build?

我似乎成功构建了一个内核映像,但我无法生成我期望的所有模块。我希望有更多模块,因为我在 gconfig window 中看到它们已启用。 Here 是我的制作会话的副本。似乎 make 进入了设备目录。我不明白为什么不创建 .ko 文件。我希望看到 .ko 文件。我检查了 /drivers 目录下的 Makefile,我可以看到它配置了很多行,比如

obj-$(CONFIG_PCI)               += pci/

例如,它指示 make 构建 pci 模块。我认为这意味着我应该看到一些 .ko 文件。但我不。我只看到一个 .ko 文件用于 scsi 模块。我喜欢能够构建所有选定的模块。

我还验证了我发出时启用了一些模块:

make VARIANT_DEFCONFIG=msm8974_sec_hlte_spr_defconfig msm8974_sec_defconfig SELINUX_DEFCONFIG=selinux_defconfig gconfig

但正如我所说,我没有看到他们中的任何一个。请问我错过了什么?

@Subin - 谢谢。我刚试过 make modules_install。我必须提到我正在为一个手臂目标交叉编译它。我相信 modules_install 是为了安装您所在机器的驱动程序?我收到一条关于需要成为 root 用户的消息,但我没有继续。我一直在想什么时候需要运行它。请问它具体是做什么的?

回复:制作模块;我以前有运行。我会 运行 再 post 结果。因为我得到了一个 .ko 文件,所以我认为问题出在那个模块与我的配置中启用的所有其他模块之间有所不同。这是我 运行 制作模块时得到的:

sansari@ubuntu:~/WORKING_DIRECTORY$ make modules
CHK     include/linux/version.h
CHK     include/generated/utsrelease.h
make[1]: `include/generated/mach-types.h' is up to date.
CALL    scripts/checksyscalls.sh
Building modules, stage 2.
MODPOST 1 modules

回复:您对 .ko 文件位置的评论,我正在查找以查看是否我没有找到正确的位置,它只能找到已构建的位置。不是其他的。这是输出:

sansari@ubuntu:~/WORKING_DIRECTORY$ find . -type f -name "*.ko"
./drivers/scsi/scsi_wait_scan.ko
sansari@ubuntu:~/WORKING_DIRECTORY$ 

我是否应该 运行 在详细模式下使 v=1?这会提供更多关于为什么没有构建其他模块的信息吗?

@Gil Hamilton - 谢谢。你是对的。这是 .config 文件的摘录:

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
# CONFIG_BLK_DEV_SR is not set
CONFIG_CHR_DEV_SG=y
CONFIG_CHR_DEV_SCH=y
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y
CONFIG_SCSI_WAIT_SCAN=m

此条目是唯一设置为 'm' 的条目。

linux 内核构建系统中的大多数设备驱动程序模块使用三态(3 值)配置设置。选项是

  • 'n'(根本不构建),
  • 'y'(构建并 link 静态进入主内核对象),以及
  • 'm'(构建为动态加载模块)。

这些值由 .config 的内容决定。 .config 中的值通常是从现有的配置文件生成的(在 arch/<ARCH>/configs 中查找你的 <ARCH>)。还要检查 'make help' 的输出以获得有趣的配置目标。

如果您没有看到正在创建的 .ko 文件,则表示相应的配置变量设置为 'y' 或 'n'。