linux内核模块编译的先决条件

时间:2015-04-03 14:43:15

标签: c linux module linux-kernel

我刚开始学习Linux内核模块,我所指的那本书说:

"为了使[编译]工作,必须适当地准备内核源代码;特别是它必须有一个配置文件(主内核源目录中的.config)和正确的依赖关系设置"

但是,据我所知(并且已经尝试过),.config文件是由make menuconfig(或任何等效的make config命令)生成的 - 这似乎不是足以让我的模块文件编译。我在内核源目录中需要做的最低限度是什么?

make modules

1 个答案:

答案 0 :(得分:1)

是的,.config文件是使用make *config生成的。

以下是其中一些:

make defconfig为您的架构创建默认配置。

make config是最原始的方法,它会在每个配置上提示。

make menuconfig是ncurses配置菜单。如果我没有直接编辑.config文件,那就是我喜欢的那个。

make gconfig与menuconfig类似,但使用gtk +。

请勿忘记在自己修改.config文件后应调用make oldconfig

您当前的配置也可能存储在磁盘上的某个位置。对于许多Linux版本,它的位置是/boot/config-$(uname -r)如果它存在,你可以从它开始。如果没有,最好的选择是make defconfig,然后编辑配置文件以满足您的需求。

配置完成后:

在构建模块之前,您可能希望编译内核,因为当前内核不会使用您的模块,即使您使当前内核使用这些模块,它也很可能会引起恐慌,因为符号表将不是您编译的模块假定的顺序。 make -jN是最常用的编译方法,N是CPU核心数的两倍。这也编译模块,但为它们创建.ko文件,而不是嵌入到vmlinuz文件中。

之后,您可以sudo make install安装内核。这通常会将您刚编译成的内核对象包装成合适的格式并放在/boot下(实际上它不必是/ boot)。

然后您sudo make modules_install将创建的.ko文件复制到/lib/modules/$(uname -r)。这构建了所有模块。

完成此操作后,您可能更愿意只构建自己的模块,而不是所有模块。在内核树根上时,您可以make M=your_modules_relative_path仅构建模块。

我不知道您正在阅读哪本书,但如果您要在外部构建模块,则仍需执行上述工作。之后,您可以使用LDD示例作为makefile的起点。

请参阅https://github.com/duxing2007/ldd3-examples-3.x