[英]Linux: Compiling a kernel device driver in standalone fashion
我正在为ARM板编译linux。 我需要对内核存储库中存在的现有驱动程序代码进行一些自定义更改,然后重新加载驱动程序。
我期待在做完make后在驱动程序目录中找到一个“ .ko”文件,但是不存在这样的文件。 显然,uImage /设备树图像编译无法通过这种方式进行。
我需要编写自己的Makefile来进行独立的设备驱动程序编译吗?
这可能是一个愚蠢的问题,但是对不起,我对于内核/设备驱动程序还不是很陌生。
编辑:我按照此处概述的过程进行操作: http ://odroid.com/dokuwiki/doku.php?id=en:c1_building_kernel git checkout并安装了交叉编译器(arm-linux-gnueabihf-gcc 4.9.2)之后,我发出基本的命令
$ 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中的其他配置更改为三态。 一旦在内核配置中选择驱动程序为“ M”,就可以将驱动程序编译为模块。 然后,您应该能够看到与驱动程序相对应的“ .ko”文件。
此外,在将驱动程序构建为模块时,请确保使用EXPORT_SYMBOL(foo),以便在加载模块符号时能够照顾到所有依赖项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.