? ? 《Linux内核编译》介绍了内核整编和安装,此时一些独立安装的驱动模块(例如NVIDIA显卡驱动模块)将会变得不可用,不太适用于只想修改某个模块代码的情况。鉴于此,本文总结出单独编译某个内核模块的方法,不影响内核其它模块的正常运行,同时降低编译时间,这对于内核模块的开发调试非常有用。
? ? 下载内核源码,以便于获取、修改、编译其中的模块,例如Ubuntu22.04可以安装6.2.0源码:
sudo apt-get install -y linux-source-6.2.0
(1)打开需要单独编译的模块Makefile,添加modules、modules_install以及clean配置,例如virtio_gpu模块的配置如下:
--- a/drivers/gpu/drm/virtio/Makefile
+++ b/drivers/gpu/drm/virtio/Makefile
@@ -1,3 +1,15 @@
+ifeq ($(KERNELRELEASE),)
+ KERNELDIR?=/lib/modules/$(shell uname -r)/build
+ PWD := $(shell pwd)
+modules:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
+modules_install:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
+clean:
+ rm -rf *.o *~ core .depend .*.cmd *.ko *.mod *.mod.c .tmp_versions
+ rm -rf .cache.mk Module.symvers modules.order
+
+else
# SPDX-License-Identifier: GPL-2.0
#
# Makefile for the drm device driver. This driver provides support for the
@@ -9,3 +21,5 @@ virtio-gpu-y := virtgpu_drv.o virtgpu_kms.o virtgpu_gem.o virtgpu_vram.o \
virtgpu_ioctl.o virtgpu_prime.o virtgpu_trace_points.o
obj-$(CONFIG_DRM_VIRTIO_GPU) += virtio-gpu.o
+
+endif
(2)然后执行”make“即可启动编译,过程根据出错提示进行解决即可,例如virtio_gpu模块需要将define_trace.h的头文件的查找路径改为绝对路径,例如:
--- a/drivers/gpu/drm/virtio/virtgpu_trace.h
+++ b/drivers/gpu/drm/virtio/virtgpu_trace.h
@@ -48,5 +48,5 @@ DEFINE_EVENT(virtio_gpu_cmd, virtio_gpu_cmd_response,
#endif
#undef TRACE_INCLUDE_PATH
-#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/virtio
+#define TRACE_INCLUDE_PATH /home/liyihai/Work/Projects/Linux/Kernel/ubuntu-6.2.16/drivers/gpu/drm/virtio
? ? ”sudo make modules_install“即可安装,默认安装到”/lib/modules/$(shell uname -r)/extra“目录,可通过下面参数改变安装位置:
INSTALL_MOD_PATH | |
INSTALL_MOD_DIR |
[1]单独编译某个驱动模块
[2]【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)
[5]Linux内核模块创建