Linux模块编译

发布时间:2023年12月29日

0? 前言

? ? 《Linux内核编译》介绍了内核整编和安装,此时一些独立安装的驱动模块(例如NVIDIA显卡驱动模块)将会变得不可用,不太适用于只想修改某个模块代码的情况。鉴于此,本文总结出单独编译某个内核模块的方法,不影响内核其它模块的正常运行,同时降低编译时间,这对于内核模块的开发调试非常有用。

1 准备

? ? 下载内核源码,以便于获取、修改、编译其中的模块,例如Ubuntu22.04可以安装6.2.0源码:

sudo apt-get install -y linux-source-6.2.0

2 编译

(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

3 安装

? ? ”sudo make modules_install“即可安装,默认安装到”/lib/modules/$(shell uname -r)/extra“目录,可通过下面参数改变安装位置:

INSTALL_MOD_PATH
INSTALL_MOD_DIR

参考资料

[1]单独编译某个驱动模块

[2]【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)

[3]编译完linux内核后如何指定内核模块安装路径?

[4]linux内核makefile概览

[5]Linux内核模块创建

文章来源:https://blog.csdn.net/Q1302182594/article/details/8684330
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。