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

编译驱动一般采用的是将驱动编译成模块(.ko 文件),然后加载到内核,这其中就用到了 make modules 命令。

一、单模块编译

1、一个 c 文件编译成一个 ko 文件

下面是最简易的单文件单模块编译,假设我们要将源文件 chrdevbase.c 编译成 ko 文件。

KERNEL_DIR  := /home/pigeon/workspace/imx6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
CURRENR_DIR    := $(shell pwd)
obj-m        := chrdevbase.o 
 
build: kernel_modules
kernel_modules:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) modules
 
.PHONY:clean
clean:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) clean

KERNEL_DIR  := xxx

KERNEL_DIR  代表内核源码的位置,后续 make modules 会用到

CURRENR_DIR    := xxx

 CURRENR_DIR  代表当前模块源文件所在的路径

obj-m    := chrdevbase.o 

obj-m 表示把文件 chrdevbase.o 作为"模块"编译,不会编译进内核,但会生成一个独立的 ko 文件

obj-y 则是直接编译进内核,即加入到内核源码中

$(MAKE)  -C  $(KERNEL_DIR)  M=$(CURRENR_DIR)  modules

这一句我们拆成两个阶段,由简入繁分析。-C $(KERNEL_DIR) 代表切换工作目录,因为内核源码顶层的Makefile文件定义了伪目标 modules,所以要先将工作目录切换到内核源码顶层 Makefile 所在位置。

make modules -C $(KERNEL_DIR)

M=$(CURRENR_DIR) 表示回到当前路径继续执行当前的Makefile。这个可以让makefile 回到自己所指定的目录下查找模块源码,将其编译,生成 ko 文件。

make modules -C $(KERNEL_DIR) M=$(CURRENR_DIR)
2、多个文件编译成一个 ko 文件

假设我们要将 add.c、sub.c 编译成一个ko文件,只有 add.c 包含了模块初始化函数(module_init),sub.c 只是add.c 的依赖源文件。大体和上面单文件单模块类似,不同之处如下:

obj-m            +=         模块名.o
模块名-objs  +=         源文件名.o ...

如:

obj-m            +=:  calc.o
calc-objs     +=   add.o  sub.o 
KERNEL_DIR  := /home/pigeon/workspace/imx6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
CURRENR_DIR    := $(shell pwd)
obj-m        += calc.o        # obj-m        += 模块名.o
calc-objs   := add.o sub.o   # 模块名-objs  += 源文件名.o ...
    
build: kernel_modules
kernel_modules:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) modules
 
.PHONY:clean
clean:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) clean

二、多模块编译(多文件多模块)

从上面《多文件单模块》可以了解到 obj-m 指定最终模块名,<modules_name>-objs 指定依赖源文件列表。所以如果要生成多个模块,那就需要通过 obj-m 指定,而且最终模块名要和源文件名对应。

KERNEL_DIR  := /home/pigeon/workspace/imx6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
CURRENR_DIR    := $(shell pwd)
 
obj-m += hello.o  calculate.o     # 需要存在对应的 hello.c 和 calculate.c 文件
                                 
build: kernel_modules
kernel_modules:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) modules
 
.PHONY:clean
clean:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURRENR_DIR) clean


原文链接:https://blog.csdn.net/challenglistic/article/details/131803720

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值