单独编译内核模块

Posted Li-Yongjun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单独编译内核模块相关的知识,希望对你有一定的参考价值。

前言

在开发和调试某个内核模块时,如果采用整体编译内核的方式,那效率就太低了。我们通常采用单独编译的方式进行。

step 1

拷贝内核模块到 workspace,以英特尔以太网卡驱动 drivers/net/ethernet/intel/ 为例

cp linux-5.13/drivers/net/ethernet/intel/ ./ -rf

step 2

改写 Makefile
原始

# SPDX-License-Identifier: GPL-2.0
#
# Makefile for the Intel network device drivers.
#

obj-$(CONFIG_E100) += e100.o
obj-$(CONFIG_E1000) += e1000/
obj-$(CONFIG_E1000E) += e1000e/
obj-$(CONFIG_IGB) += igb/
obj-$(CONFIG_IGC) += igc/
obj-$(CONFIG_IGBVF) += igbvf/
obj-$(CONFIG_IXGBE) += ixgbe/
obj-$(CONFIG_IXGBEVF) += ixgbevf/
obj-$(CONFIG_I40E) += i40e/
obj-$(CONFIG_IXGB) += ixgb/
obj-$(CONFIG_IAVF) += iavf/
obj-$(CONFIG_FM10K) += fm10k/
obj-$(CONFIG_ICE) += ice/

改写后

# SPDX-License-Identifier: GPL-2.0
#
# Makefile for the Intel network device drivers.
#

obj-m += e100.o
obj-m += e1000/
#obj-$(CONFIG_E1000E) += e1000e/
#obj-$(CONFIG_IGB) += igb/
#obj-$(CONFIG_IGC) += igc/
#obj-$(CONFIG_IGBVF) += igbvf/
#obj-$(CONFIG_IXGBE) += ixgbe/
#obj-$(CONFIG_IXGBEVF) += ixgbevf/
#obj-$(CONFIG_I40E) += i40e/
#obj-$(CONFIG_IXGB) += ixgb/
#obj-$(CONFIG_IAVF) += iavf/
#obj-$(CONFIG_FM10K) += fm10k/
#obj-$(CONFIG_ICE) += ice/

KDIR=/lib/modules/$(shell uname -r)/build
DIRS := . $(shell find -type d)
GARBAGE_PATTERNS := *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.mod *.order *.symvers
GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS)))

all:
	$(MAKE) -C $(KDIR) M=$(shell pwd) modules

clean:
	rm -rf $(GARBAGE)

注释掉不需要的模块,将需要的模块添加到 obj-m。
OK

以上是关于单独编译内核模块的主要内容,如果未能解决你的问题,请参考以下文章

使用itop4412开发板单独编译驱动模块

linux内核模块编译makefile

如何通过编译Linux内核打开IPVS(LVS)的debug模式

linux 单独编译一个模块(模块已存在)

如何单独编译Android源代码中的模块

Linux内核模块管理