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
注意:根据模块依赖性,您可能需要完全重建内核