添加驱动模块到内核的两种方法

添加驱动模块到内核的两种方法

1. 放在内核源代码树中

步骤总结:

  1. 新建文件夹
  2. 编写Makefile、编写Kconfig
  3. 修改上层Kconfig
  4. 执行make menuconfig
  5. 执行make zImage 或 make modules
1.1 源码放入文件夹

例如:添加一个按键字符设备模块

  • 在内核目录下的 drivers/char 目录下新建文件夹 mykey

  • 在 drivers/char/ 下的 Makefile 中添加一行

    obj-m += mykey/
    这行指令告诉模块构建系统,在编译模块时需要进入 mykey/ 子目录中有可能的选择是,驱动程序的编译取决于一个特殊的配置选项,例如 CONFIG_MYKEY ,则指令要替换成
    obj-$(CONFIG_MYKEY) += mykey/
    
  • 最后,在 drivers/char/mykey/ 目录下添加一个 Makefile,其中需要有下面这行指令

    obj-m += mykey.o
    表示进入 mykey/ 子目录后,要将 mykey.c 编译成 mykey.o,但最终会生成 mykey.ko 文件如果加了编译选项,则指令如下
    obj-$(CONFIG_MYKEY) += mykey.o
    
  • 另外,如果后续你的按键程序需要使用到其他的源文件,可以将 mykey/ 目录下的 Makefile 做如下修改

    obj-$(CONFIG_MYKEY) += mykey.o
    mykey-objs := mykey_main.o other.o
    表示 mykey_main.c 和 other.c 会一起被编译和链接进 mykey.ko 文件
    
1.2 源码放入设备总目录下

如果只有一两个源文件,则可以选择不新建文件夹,直接将 mykey.c 放入到 drivers/char/ 目录下,在 drivers/char/ 目录下的 Makefile 中添加如下指令即可

obj-m += mykey.o如果配置了编译选项,则指令为
obj-$(CONFIG_MYKEY) += mykey.o如果有多个源文件,则指令为
obj-$(CONFIG_MYKEY) += mykey.o
mykey-objs := mykey_main.o other.o

即将原本 drivers/char/mykey/Makefile 的内容全部写到 drivers/char/Makefile 中。

1.3 管理配置选项
  • 在 drivers/char/mykey/ 目录下新建一个 Kconfig 文件(如果没有独立目录,则直接在 drivers/char/Kconfig 中添加)

  • 添加如下内容(实例)

    config MYKEYtristate "This is config of mykey"default nhelp If you chose Y, support this key function, this key will be compiledinto the kernel.you can also chose M, then this driver will be built as a module named mykey.ko.
    
  1. 第一行定义了该选项所代表的配置目标(注意 CONFIG_ 前缀不必写上)

  2. 第二行声明选项类型为 “tristate” ,它有三个选项N Y M,Y表示可以编译进内核,M表示作为模块编译,N表示不操作。

  3. 第三行是默认的选项类型

  4. help 表示为该选项提供帮助文档

  5. 除了上述选项外,还有其他选项,比如 depends 指令,规定了该选项的依赖选项,表示必须将依赖选项设置,才可以选择本选项

    depends on MENU_KEY

  6. 在 drivers/char/Kconfig 文件中添加

    source “drivers/char/mykey/Kconfig”

执行 make menuconfig 后结果如下
在这里插入图片描述

如果 Kconfig 的内容改成这样(带菜单)

menu "Config my key"config MYKEY    tristate "This is config of mykey"    default n    help       If you chose Y, support this key function,       this key will be compiledinto the kernel.      you can also chose M, then this driver will       be built as a module named mykey.ko.endmenu

make menuconfig 找到 MYKEY(可以看到多出一个菜单来)
在这里插入图片描述

按 “h” 进入 help
在这里插入图片描述
make menuconfig 之前看一眼内核根目录下的 .config 文件, CONFIG_MYKEY 还未定义

在这里插入图片描述
我们使用 make menuconfig 将 CONFIG_MYKEY 选项选择为 M 后,看一下内核目录下的 .config 文件
在这里插入图片描述

别忘了在 drivers/char/mykey/Makefile 中添加内容

obj-$(CONFIG_MYKEY) += mykey.o

make modules 后观察 drivers/char/mykey/ 目录下的文件,多出了许多文件,其中包括 key.ko
在这里插入图片描述

如果要编译进内核中, CONFIG_MYKEY 选项选择为 Y ,然后执行 make zImage,会发现生成的zImage镜像大小增加了一些,但是不会在 drivers/char/mykey/ 下生成 key.ko ,不过会生成 key.o

PS:obj-y(对应 make zImage))是指将模块编译进内核(zImage)

obj-m(对应 make modules)是指编译模块生成 ko 文件


2. 放在内核代码外

如果我们希望编写的模块可以被动态的加载到内核中,即使用 insmod、modprobe 命令,则不能将模块代码直接放入内核源码树中了。

只需在自己编写的模块目录中新建一个 Makefile 文件,由于是在内核源码外围,所以我们需要告诉 make 工具如何找到内核源代码文件和基础的 Makefile 文件

为什么需要找到内核源码和基础 Makefile 文件?

答:因为驱动代码中使用到了内核提供的函数、头文件等等,编译成最终的 ko 文件也是要遵循内核的编译方法

Makefile 中一定要包含以下指令

make -C 内核所在路径 M=$PWD modulesobj-m += mykey.o

一般的 Makefile 的写法如下:

KERN_DIR = /home/内核路径all:make -C $(KERN_DIR) M=`pwd` modulesclean:make -C $(KERN_DIR) M=`pwd` modules cleanobj-m += mykey.o

执行make后,生成mykey.ko文件,使用动态加载命令插入进内核

insmod mykey.ko

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149014.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【推荐系统】多任务学习模型

介绍一些多任务学习模型了解是如何处理多任务分支的。 ESSM, Entire Space Multi-Task Model 阿里提出的ESSM全称Entire Space Multi-Task Model,全样本空间的多任务模型,有效地解决了CVR建模(转化率预估)中存在的两个非常重要…

MATLAB中plot3函数用法

目录 语法 说明 向量和矩阵数据 表数据 其他选项 示例 绘制三维螺旋图 绘制多个线条 使用矩阵绘制多个线条 指定等间距刻度单位和轴标签 将点绘制为不带线的标记 自定义颜色和标记 指定线型 在绘图后修改线条 绘制表中的数据 在 x 和 y 轴上绘制多个表变量 指…

10.2 调试事件获取DLL装载

理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知…

Qt扫盲-QSqlTableModel理论总结

QSqlTableModel理论总结 一、概述二、使用1. 与 view 视图绑定2. 做中间层,不显示 三、常用函数 一、概述 QSqlTableModel是用于从单个表读写数据库记录的高级接口。它构建在较低级的QSqlQuery之上,可用于向QTableView 等视图类提供数据。这个主要是对单…

苹果V3签名是什么?优势是什么?什么场合需要应用到?该怎么部署?

v3签名,或称为Apple Developer Program v3签名,是苹果公司在2021年6月推出的一种签名格式,用于对应用程序进行签名和验证。 它是取代了之前的v2签名格式,用于增强应用程序的安全性和完整性。 v3签名能够做到以下几点:…

【Linux基础】Linux发展史

👉系列专栏:【Linux基础】 🙈个人主页:sunny-ll 一、前言 本篇主要介绍Linux的发展历史,这里并不需要我们掌握,但是作为一个合格的Linux学习者与操作者,这些东西是需要了解的,而且…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(五)

思维导图 Bom操作 一、Window对象 1.1 BOM(浏览器对象模型) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vi…

k8s集群-6(daemonset job cronjob控制器)

Daemonset 一个节点部署一个节点 当有节点DaemonSet 确保全部 (或者某些) 节点上运行一个 Pod 的副本。加入集群时&#xff0c;也会为他们新增一个 Pod 。当有节点从集群移除时&#xff0c;这些Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的典型用…

Boost程序库完全开发指南:1.1-C++基础知识点梳理

主要整理了N多年前&#xff08;2010年&#xff09;学习C的时候开始总结的知识点&#xff0c;好长时间不写C代码了&#xff0c;现在LLM量化和推理需要重新学习C编程&#xff0c;看来出来混迟早要还的。 1.shared_ptr 解析&#xff1a;shared_ptr是一种计数指针&#xff0c;当引…

数字电路逻辑与设计 之循环码和 移存码

有发现错误的能力&#xff0c;不能纠正 只能检查单次的错误&#xff0c;不能完全抗干扰 可以按照上面的方法来循环构造 移存码可以通过前推后推来实现

pycharm配置python3.8版本专门用于undecteded_chromedriver测试

pycharm配置python3.8版本专门用于undecteded_chromedriver测试 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://pay.xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、Pycharm及python环境的配置 1.安装python-3.8.7rc1-amd64.e…

MySQL进阶_3.性能分析工具的使用

文章目录 第一节、数据库服务器的优化步骤第二节、查看系统性能参数第三节、 慢查询日志第四节、 查看 SQL 执行成本第五节、 分析查询语句&#xff1a;EXPLAIN5.1 基本语法5.2 EXPLAIN各列作用 第一节、数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;可…

十三、Django之添加用户(原始方法实现)

修改urls.py path("user/add/", views.user_add),添加user_add.html {% extends layout.html %} {% block content %}<div class"container"><div class"panel panel-default"><div class"panel-heading"><h3 c…

全志ARM926 Melis2.0系统的开发指引①

全志ARM926 Melis2.0系统的开发指引① 1. 编写目的2. Melis2.0 系统概述3. Melis2.0 快速开发3.1. Melis2.0 SDK 目录结构3.2. Melis2.0 编译环境3.3. Melis2.0 固件打包3.4. Melis2.0 固件烧录3.5.串口打印信息3.6. Melis2.0 添加和调用一个模块3.6.1. 为什么划分模块&#xf…

[GWCTF 2019]枯燥的抽奖

参考 https://www.cnblogs.com/AikN/p/15764428.html [GWCTF 2019]枯燥的抽奖-CSDN博客 打开环境 笑死我了&#xff0c;怎么那么像我高中校长 查看源代码 看到check.php&#xff0c;去访问一下 ok看到源代码了 因为上次做过&#xff0c;看到这个我就想到用php_mt_seed逆推…

【Hello Linux】多路转接之 epoll

本篇博客介绍&#xff1a; 多路转接之epoll 多路转接之epoll 初识epollepoll相关系统调用epoll的工作原理epoll服务器编写成员变量构造函数 循环函数HandlerEvent函数epoll的优缺点 我们学习epoll分为四部分 快速理解部分概念 快速的看一下部分接口讲解epoll的工作原理手写epo…

解决ASP.NET Core的中间件无法读取Response.Body的问题

概要 本文主要介绍如何在ASP.NET Core的中间件中&#xff0c;读取Response.Body的方法&#xff0c;以便于我们实现更多的定制化开发。本文介绍的方法适用于.Net 3.1 和 .Net 6。 代码和实现 现象解释 首先我们尝试在自定义中间件中直接读取Response.Body&#xff0c;代码如…

Arcgis提取玉米种植地分布,并以此为掩膜提取遥感影像

Arcgis提取玉米种植地分布上&#xff0c;并以此为掩膜提取遥感影像 一、问题描述 因为之前反演是整个研究区&#xff0c;然而土地利用类型有很多类&#xff0c;只在农田或者植被上进行反演&#xff0c;需要去除水体、建筑等其他类型&#xff0c;如何处理得到下图中只有耕地类…

Javascript 事件的动态绑定

动态绑定事件&#xff0c;是指在代码执行过程中&#xff0c;通过Javascript代码来绑定事件。这种技术可以大大增强网页的交互性和用户体验。上一期介绍的是通过事件监听器 EventListener 去实现元素颜色的变化。这一期将通过动态绑定方法去实现&#xff0c;对象.事件 匿名函数…

常见服务器运维管理面板整理汇总

随着云计算技术的发展和普及&#xff0c;越来越多的用户开始使用云服务器来部署和运行应用程序和服务。为了方便用户管理和操作云服务器&#xff0c;各种类型的服务器管理面板应运而生。本文将整理和汇总一些常见的服务器管理面板&#xff0c;供用户参考选择。 1、宝塔面板【官…