Linux: 以独立方式编译内核设备驱动程序

Linux: Compiling a kernel device driver in standalone fashion

我正在为 ARM 板编译 linux。我需要对内核存储库中存在的现有驱动程序代码进行一些自定义更改并重新加载驱动程序。

我原以为在 make 后会在驱动程序目录中找到一个“.ko”文件,但不存在这样的文件。显然 uImage/device 树图像编译不能那样工作。

是否需要为独立设备驱动程序编译编写自己的 Makefile?

这可能是一个愚蠢的问题,但抱歉我是 kernel/device 驱动程序的新手。

编辑: 我遵循了此处概述的过程:http://odroid.com/dokuwiki/doku.php?id=en:c1_building_kernel git 签出并安装交叉编译器(arm-linux-gnueabihf-gcc 4.9.2)后,我发出基本的 make 命令

$ make odroidc_defconfig
$ make -j4
$ make -j4 modules
$ make uImage

所有步骤都成功了。最后几行日志看起来像

KSYM    .tmp_kallsyms1.o
KSYM    .tmp_kallsyms2.o
LD      vmlinux
SORTEX  vmlinux
SYSMAP  System.map
OBJCOPY arch/arm/boot/ccImage
Kernel: arch/arm/boot/ccImage is ready
Image arch/arm/boot/ccImage.lzo is ready
UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-3.10.72
Created:      Sat Mar 28 22:44:45 2015
Image Type:   ARM Linux Kernel Image (lzo compressed)
Data Size:    5459649 Bytes = 5331.69 kB = 5.21 MB
Load Address: 00208000
Entry Point:  00208000
Image arch/arm/boot/uImage is ready

编辑 2:驱动程序代码的路径 https://github.com/hardkernel/linux/tree/odroidc-3.10.y/drivers/amlogic/efuse

正在检查您的 Makefile

#                             
# Makefile for eFuse.         
#                             

obj-$(CONFIG_EFUSE) += efuse_bch_8.o efuse_version.o efuse_hw.o efuse.o 

我们了解到代码可以构建为可加载模块,也可以永久链接到内核本身。

检查来自分支 odroidc-3.10.y-android 的 odroidc_defconfig 我们发现

#
# EFUSE Support
#
CONFIG_EFUSE=y

带"y"表示代码要链接到驱动程序中。如果它改为说 "m" 它将被构建为一个模块。

您可以在内核配置中更改它,但如果在需要模块之前没有设置加载模块,它也可能会导致问题。

很可能简单地安装新构建的内核以及内部已经链接的代码(即,忘记模块的想法)就可以了。

不确定您是否还在寻找这个问题的答案。

但是查看代码中的 Kconfig 文件,表明 -

    config EFUSE 
        bool "EFUSE Driver" 

而且因为你所有的驱动文件都是用这个配置编译的,所以上面的配置描述允许CONFIG_EFUSE是'n'或'y'。所以你只能用这个构建静态模块(内置)。

您只需将上面的描述改为:

    config EFUSE 
        **tristate** "EFUSE Driver" 

并且还将 Kconfig 中的其他配置更改为三态。 一旦您在内核配置中 select 驱动程序 'M' ,这将允许您的驱动程序被编译为模块。然后就可以看到驱动对应的“.ko”文件了。

另外,确保在将驱动程序构建为模块时使用 EXPORT_SYMBOL(foo),以便在加载模块符号时处理任何依赖关系。