我按照以下方式编译了Linux内核这教程。教程说首先使用以下命令安装必要的工具:
sudo apt-get install libncurses5-dev gcc make git exuberant-ctags bc libssl-dev
然后获取配置脚本。您可以自行配置内核,使用默认配置,或从系统的 /boot 文件夹复制配置文件。我选择了最后一个选项:
cp /boot/config-4.12.0 linux-4.11.10/.config
然后编译安装:
make
make modules_install install
我重新启动进入新内核,一切似乎都正常。但是,有一个问题。当我尝试安装驱动程序时,具体来说rtl8812au,它不起作用。我运行 make,结果如下:
make ARCH=x86_64 CROSS_COMPILE= -C /lib/modules/4.11.10/build M=/home/isaac/rtl8812au modules
make[1]: Entering directory '/home/isaac/Downloads/linux-4.11.10'
CC [M] /home/isaac/rtl8812au/core/rtw_cmd.o
In file included from /home/isaac/rtl8812au/include/drv_types.h:32:0,
from /home/isaac/rtl8812au/core/rtw_cmd.c:22:
/home/isaac/rtl8812au/include/osdep_service.h: In function ‘thread_enter’:
/home/isaac/rtl8812au/include/osdep_service.h:251:2: error: implicit declaration of function ‘allow_signal’ [-Werror=implicit-function-declaration]
allow_signal(SIGTERM);
^
/home/isaac/rtl8812au/include/osdep_service.h: In function ‘flush_signals_thread’:
/home/isaac/rtl8812au/include/osdep_service.h:261:6: error: implicit declaration of function ‘signal_pending’ [-Werror=implicit-function-declaration]
if (signal_pending (current))
^
/home/isaac/rtl8812au/include/osdep_service.h:263:3: error: implicit declaration of function ‘flush_signals’ [-Werror=implicit-function-declaration]
flush_signals(current);
^
cc1: some warnings being treated as errors
scripts/Makefile.build:294: recipe for target '/home/isaac/rtl8812au/core/rtw_cmd.o' failed
make[2]: *** [/home/isaac/rtl8812au/core/rtw_cmd.o] Error 1
Makefile:1492: recipe for target '_module_/home/isaac/rtl8812au' failed
make[1]: *** [_module_/home/isaac/rtl8812au] Error 2
make[1]: Leaving directory '/home/isaac/Downloads/linux-4.11.10'
Makefile:1052: recipe for target 'modules' failed
make: *** [modules] Error 2
在我的发行版(Ubuntu)附带的内核上,这始终有效。似乎这个内核缺少了一些东西。但是,我该如何弥补呢?
更新:我尝试编译 Linux 内核 4.4,发现 rtl8812au 驱动程序可以在其上编译。因此问题似乎出在较新的内核上,而不是编译过程上。我感谢 pilot6 和 bodhi.zazen 在评论中指出了这一点(尽管版本 4.4 高于 3.10。因此它确实可以在高于 3.10 的版本上运行,但不能在高于 4.11 或 4.12 的版本上运行)。
此外,我发现如果我在不运行驱动程序的情况下配置内核make localmodconfig
,则无法在编译的内核上安装驱动程序。驱动程序可以构建,但随后make install
会失败,并出现某个目录不存在的错误。如果我创建它,modprobe
也会失败。
无论如何,我认为这是因为make localmodconfig
查看当前正在使用的模块并仅构建这些模块。如果给定的驱动程序未使用/未安装,则内核不会为其配置,这意味着您以后无法安装它。因此,如果您计划安装当前未使用/未安装的驱动程序,则只需复制系统的配置文件即可。(如果我错了,请有人纠正我。)