如何构建单个树内内核模块?

如何构建单个树内内核模块?

linux-source-... 有一个模块在配置 /boot/config-3.4-trunk-686-pae 中被禁用,因此它不是 linux-image-... 的一部分(这是在 Debian 上,但解决方案应该与 Ubuntu 相同,或者?),例如

# CONFIG_CAN_PEAK_USB is not set

如何编译该内核模块,以便它可以与分布式内核一起使用?

相应的 linux-source-... 包已安装、解压并链接到 /usr/src/linux。/boot/config-3.4-trunk-686-pae 被复制到 /usr/src/linux/.config 并使用以下修改

CONFIG_CAN_PEAK_USB=m

make
make modules

可以编译内核和所有模块。但是如何只编译特定的单个模块呢?

(注意:还需要先编译内核,否则会出现以下错误no symbol version for module_layout:)

答案1

我遇到了同样的问题。我认为你不仅需要复制 .config,还需要复制 Module.symvers

我编译模块 ft1000 的步骤(运行 Debian Wheeze 7.1.0;内核 3.2.0-4-686-pae):

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000

答案2

在顶级源目录中,只需提供模块名称或模块目录的路径,例如:

make drivers/net/can/usb/peak_usb/

或者更简单的例子(Intel e1000 以太网驱动程序):

make drivers/net/ethernet/intel/e1000/e1000.ko

答案3

  • 为了建立最终模块图像在目录中,您可以使用命令M=的参数make

    使 M=drivers/usb/serial

这将在该目录中构建所有需要的文件并链接最终的模块图像。

  • 构建仅限特定文件在内核树中,只需将其作为参数传递给make

    制作驱动程序/usb/serial/visor.ko

构建系统将为 visor.ko 内核模块构建所有需要的文件,并进行最后的链接以创建该模块。

答案4

就这么简单:(此示例说明了 ft1000 驱动程序,这只需几分钟甚至几秒钟)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

modprobe然后你可以使用depmod

注意:根据模块依赖性,您可能需要完全重建内核

相关内容