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

这篇具有很好参考价值的文章主要介绍了【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


目录

一、单模块编译

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

2、多个文件编译成一个 ko 文件

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


一、单模块编译

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 指定,而且最终模块名要和源文件名对应。文章来源地址https://www.toymoban.com/news/detail-688092.html

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

到了这里,关于【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Shell 命令集合 系统设置 】Linux 加载和卸载内核模块 modprobe命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 modprobe命令是Linux系统中用于加载和卸载内核模块的工具。内核模块是一种可以动态加载到内核中的代码,它们可以扩展内核的功能,添加新的驱动程序或功能。 modprobe命令的主要作用有以下几个方面: 加载内核模块:modprobe命令可以根据

    2024年02月04日
    浏览(42)
  • 【Shell 命令集合 系统设置 】⭐Linux 向内核中加载指定的模块 insmod命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 insmod命令是Linux系统中的一个命令,用于向内核中加载指定的模块。它的作用是将指定的模块文件加载到内核中,使得系统可以使用该模块提供的功能。 模块是一种可以动态加载到内核中的代码,它可以扩展内核的功能。在Linux系统中,模

    2024年02月07日
    浏览(47)
  • Linux驱动开发——内核模块

    目录 内核模块的由来 第一个内核模块程序  内核模块工具  将多个源文件编译生成一个内核模块  内核模块参数 内核模块依赖 关于内核模块的进一步讨论  习题 最近一直在玩那些其它的技术,眼看快暑假了,我决定夯实一下我的驱动方面的技能,迎接我的实习,找了一本

    2024年02月04日
    浏览(56)
  • ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核

    编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程:在线视频与配套资料》里面可以下载到),还有参考 菜

    2024年02月04日
    浏览(37)
  • 【嵌入式Linux内核驱动】内核模块三要素与验证测试

    内核模块 Linux内核模块是一种可以动态加载和卸载的软件组件,用于扩展Linux操作系统的功能。Linux内核本身只包含了必要的核心功能,而内核模块则允许开发者在运行时向内核添加新的功能、驱动程序或文件系统支持,而无需重新编译整个内核或重新启动系统。 内核模块是

    2024年02月06日
    浏览(39)
  • Linux驱动实践:带你一步一步编译内核驱动程序

    记得以前我在开始学习驱动开发的时候,找来很多文章、资料来学习,但是总是觉得缺少了点全局视角。 就好像:我想看清一座山的全貌,但总是被困在一个、又一个山谷中一样。 主要的困惑有 3 点: 每一篇文章的介绍都是正确的,但是如果把很多文章放在一起看,就会

    2023年04月24日
    浏览(39)
  • Linux 编译内核模块出现--Unknown symbol mcount

    Linux suse: 在编译SUSE Linux Enterprise Server 12 SP时,使用低版本的docker镜像编译内核模块时,加载内核模块时出现: 加载内核模块时: (1) 指示系统可能受到 Spectre V2 漏洞的影响,并且正在加载的模块没有使用 retpoline 编译器进行编译。 Spectre V2(CVE-2017-5715)是 Spectre 漏洞家族

    2024年02月11日
    浏览(41)
  • 【linux驱动】用户空间程序与内核模块交互-- IOCTL和Netlink

    创建自定义的IOCTL(输入/输出控制)或Netlink命令以便用户空间程序与内核模块交互涉及几个步骤。这里将分别介绍这两种方法。 1. 定义IOCTL命令 在内核模块中,需要使用宏定义你的IOCTL命令。通常情况下,IOCTL命令包括了一个命令编号、请求类型的方向(读/写/两者)以及数

    2024年01月20日
    浏览(27)
  • 编译正点原子kernel报错make: arm-linux-gnueabihf-gcc:命令未找到

    需要在 Makefile 添加完整路径内容: 解决办法:

    2024年02月02日
    浏览(35)
  • linux|操作系统|centos7物理机安装网卡驱动8188gu(内核升级,firmware固件,USB设备管理,module管理)

    目前服务器领域centos7基本是主流的操作系统,而linux相对于Windows来说,软硬件方面的支持是差很多的,在硬件方面来说,以一个免驱的网卡为例,window xp可能不会自动识别到,但Windows10基本都会自动识别到,简简单单的即插即用。根本原因在Windows随着版本的升级,内置的各

    2024年01月20日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包