linux 内核模块编译先决条件
linux kernel module compilation pre-requisites
我刚刚开始学习 linux 内核模块,我所指的那本书说:
"For this [compilation] to work, the kernel source has to be suitably prepared; in particular it has to have a configuration file (.config in the main kernel source directory) and proper dependencies setup"
然而,据我所知(并已尝试过),.config 文件是由 make menuconfig
(或任何等效的 make config 命令)生成的 - 这似乎不是足以让我的模块文件编译。我需要在内核源目录中做的最低限度是什么?
make modules
?
是的,.config 文件是使用 make *config
.
生成的
以下是其中一些:
make defconfig
为您的架构创建默认配置。
make config
是最原始的方法,每次配置都会提示。
make menuconfig
是 ncurses 配置菜单。如果我不直接编辑 .config 文件,那是我更喜欢的。
make gconfig
类似于 menuconfig,但使用 gtk+。
别忘了make oldconfig
要自己修改.config文件后调用
您当前的配置也可能存储在磁盘上的某个位置。对于许多 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 的起点。
我刚刚开始学习 linux 内核模块,我所指的那本书说:
"For this [compilation] to work, the kernel source has to be suitably prepared; in particular it has to have a configuration file (.config in the main kernel source directory) and proper dependencies setup"
然而,据我所知(并已尝试过),.config 文件是由 make menuconfig
(或任何等效的 make config 命令)生成的 - 这似乎不是足以让我的模块文件编译。我需要在内核源目录中做的最低限度是什么?
make modules
?
是的,.config 文件是使用 make *config
.
以下是其中一些:
make defconfig
为您的架构创建默认配置。
make config
是最原始的方法,每次配置都会提示。
make menuconfig
是 ncurses 配置菜单。如果我不直接编辑 .config 文件,那是我更喜欢的。
make gconfig
类似于 menuconfig,但使用 gtk+。
别忘了make oldconfig
要自己修改.config文件后调用
您当前的配置也可能存储在磁盘上的某个位置。对于许多 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 的起点。