驱动模块和printk函数

目录

1. 驱动模板

1.1. 在源码工程路径下创建.c文件

1.2. 编写驱动模板

1.3. 将模板放到ubuntu上

1.4. 书写Makefile

1.5. 编译和安装

2. printk

2.1. Source Insight查找命令

2.2. printk讲解

2.2.1. 分析函数

2.2.2. 编写代码

2.3. 拓展

2.3.1. 关于printk函数测验用到的命令(掌握)

2.3.2. 赋值知识点

2.3.3. 打印级别的修改


驱动模块由三部分组成:

  1. 入口(安装):资源的申请
  2. 出口(卸载):资源的释放
  3. 许可证:GPL

1. 驱动模板

1.1. 在源码工程路径下创建.c文件

1.2. 编写驱动模板

//头文件支持
#include <linux/init.h>
#include <linux/module.h>
//static防止别人用重名函数
static int __init hello_init(void)//入口:资源申请
{
//_init将hello_init放到.init.text段中
return 0;
}

//static防止别人用重名函数
static void __exit hello_exit(void)//出口:资源释放
{
//_exit将hello_exit放到.exit.text段中
}
module_init(hello_init);//告诉内核驱动的入口地址
module_exit(hello_exit);//告诉内核驱动的出口地址
MODULE_LICENSE("GPL");//许可证

将文件保存到桌面上

1.3. 将模板放到ubuntu上

重点注意:此时的hello.c和任何工程都没关系是我们自己写的

作者将hello.c放在/home/hq/temp/demo下(非必须放到此处,自己决定)

1.4. 书写Makefile

KERNELDIR:=/lib/modules/$(shell uname -r)/build
#KERNELDIR:=/home/hq/temp/kernel-3.4.39/
PWD:=$(shell pwd)
all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o

Makefile解析:

KERNELDIR:= b/modules/$(shell uname -r)ild/:这行代码定义了一个变量KERNELDIR,它指定了内核源代码的路径。它使用了uname -r命令来获取当前正在运行的内核的版本号,并将其与b/modules/路径拼接在一起。这样可以确保构建模块时使用正确的内核版本

PWD:=$(shell pwd):这行代码定义了一个变量PWD,它表示当前目录的路径。pwd命令用于获取当前工作目录的路径,这样可以确保在构建模块时使用正确的路径。

all: :这是一个目标规则,表示默认目标。在这个规则下,它定义了要执行的命令。

make -C $(KERNELDIR) M=$(PWD) modules:这是all目标的命令。它使用make命令来构建内核模块。-C选项指定了内核源代码的路径M选项指定了模块源代码的路径modules表示构建模块。因此,这个命令告诉make在指定的内核源代码路径下构建模块。

clean: :这是另一个目标规则,用于清理构建过程中生成的文件。

make -C $(KERNELDIR) M=$(PWD) clean:这是clean目标的命令。它使用make命令来清理构建过程中生成的文件。与all目标类似,它使用-C选项指定了内核源代码的路径,M选项指定了模块源代码的路径,clean表示清理。

obj-m:=hello.o:这行代码定义了一个变量obj-m,它指定要构建的目标模块的名称为hello.o。在这个Makefile中,hello.o是一个示例模块的名称,你可以根据自己的需求修改它。

这个Makefile的作用是通过调用内核源代码中的Makefile来构建指定的内核模块。它通过设置正确的内核源代码路径和模块源代码路径,然后执行make命令来完成构建和清理操作。

1.5. 编译和安装

在hello.c和Makefile同级目录下执行make命令

得到下面文件

这个.ko后缀的文件是不是很熟悉?(在驱动移植篇)

我们查看Makefile

所以在ubuntu下安装就可

执行下面命令

sudo insmod hello.ko 安装命令

什么都没有发生,为什么?

拆卸命令sudo rmmod hello

2. printk

2.1. Source Insight查找命令

我们可以使用printk来进行测验

选中printk

按下ctrl+/

就能进入下面的查找页面

将使用例子放到printk处

2.2. printk讲解

2.2.1. 分析函数

printk和printf非常相似,只是多了一个打印级别

printk(KERN_ERR "SouthernBird\n")

在ubuntu下可以查看优先级别

cat /proc/sys/kernel/printk

2.2.2. 编写代码

//头文件支持
#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
//static防止别人用重名函数
static int __init hello_init(void)//入口:资源申请
{
printk("SouthernBird\n");
//_init将hello_init放到.init.text段中
return 0;
}

//static防止别人用重名函数
static void __exit hello_exit(void)//出口:资源释放
{
printk("I am leave\n");
//_exit将hello_exit放到.exit.text段中
}
module_init(hello_init);//告诉内核驱动的入口地址
module_exit(hello_exit);//告诉内核驱动的出口地址
MODULE_LICENSE("GPL");//许可证

将代码放到ubuntu下重新编译(注makefile,目前不需要进行修改)

安装试验

我们可以看到什么都没打印,这是因为ubuntu开发人员将其屏蔽了

我们可以使用dmesg命令进行查看

2.3. 拓展

2.3.1. 关于printk函数测验用到的命令(掌握)

sudo insmod hello.ko 安装驱动模块

sudo rmmod hello 卸载驱动模块

lsmod 查看模块

dmesg 查看消息

sudo dmesg -C 直接清空消息不回显

sudo dmesg -c 回显后清空

2.3.2. 赋值知识点

= :赋值 需要等其他文件全部执行完,才执行调用的

:= :立即赋值

+= :附加赋值

?= :询问变量之前是否被赋值过,如果被赋值过本次赋值不成立

2.3.3. 打印级别的修改

》1.修改系统默认的级别

su root

echo 4 3 1 7 > /proc/sys/kernel/printk

》2.如果想修改开发板对应的打印级别

vi rootfs/etc/init.d/rcS

echo 4 3 1 7 > /proc/sys/kernel/printk

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32开发环境搭建Windows VSCode集成Espressif IDF插件ESP32_IDF_V5.0开发编译环境搭建

一、安装ESP32-IDF库 下载网址&#xff1a;https://dl.espressif.com/dl/esp-idf/ 打开上面的网页&#xff0c;选择单击页面中 ESP32-IDF v5.0.2 - Offine Installer&#xff0c;5.0.2是当前最新版本&#xff0c;如果没有ESP32-IDF v5.0.2 - Offine Installer&#xff0c;说明…

ADB WIFI 链接

ADB WiFi链接手机 必须在同一网络下&#xff08;本人用的台式机网线手机连路由器WIFI&#xff09; 1.先确认USB数据线是否成功链接了手机 adb devices不管前面设备是什么名字&#xff0c;但是后面必须为device状态才算链接成功了&#xff0c;offline状态是不行的 有些没开启…

《微服务架构设计模式》第二章 服务的拆分策略

内容总结自《微服务架构设计模式》 服务的拆分策略 一、架构是什么软件架构的41视图模型为什么重要分层架构风格 二、定义微服务如何定义服务拆分难点定义服务API 一、架构是什么 软件架构的定义&#xff1a;计算机系统的软件架构是构建这个系统所需要的一组结构&#xff0c;包…

物联网Lora模块从入门到精通(八)Lora无线通信

一、前言 在某些环境下&#xff0c;无法通过有线传输数据&#xff0c;这时候我们需要使用Lora无线通信传输数据&#xff0c;Lora无线数据传输具有低功耗、距离长的特点&#xff0c;常用于工厂内等&#xff0c;需要Lora基站。 我曾做过距离测试&#xff1a;Lora模块距离测试-物联…

Linux---vim的使用

专栏&#xff1a;Linux 个人主页&#xff1a;HaiFan. 本章为大家带来Linux工具—vim Linux工具 关于rzszyumvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集简单vim配置配置文件的位置常用配置选项 关于rzsz 这个工具用于windows机器和Linux机器通过Xshell传输…

PHP伪协议filter详解,php://filter协议过滤器

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 php://filter 一、访问数据流二、过滤数据流三、多…

electron 快速创建一个本地应用

参考官方文档流程 快速入门 | Electron 建议先全局安装electron&#xff0c;npm install -g electron 开发过程中可以在本地开发安装 使用electron快速创建一个web页面 &#xff0c;参考官方demo 实例 electron-quick-start 第一步&#xff1a; mkdir my-electron-app &am…

Linux

Linux 摘要写在前面1.Linux介绍2.Linux基本概念与命令3.Shell编程4.桌面操作系统框架5.GTK图形编程6.QT图形编程7.DBUS8.GDB9.Wine开发10.高可用存储技术11.高可用网络技术12.云计算 摘要 本篇博客参考中科方德国产操作系统的培训课程&#xff0c;对其主要内容进行总结&#x…

超越密码:网络安全认证的未来

你的物理现实的数字对应物正在惊人地增长。虽然肯定会有积极的结果&#xff0c;但随着互联网的发展&#xff0c;与之相关的风险也在迅速增加。在讨论网络安全风险管理时&#xff0c;首先想到的是密码。但当出现诈骗、网络钓鱼等威胁时&#xff0c;这还不够。 那么&#xff0c;…

大数据分析与机器学习:技术深度与实例解析【上进小菜猪大数据系列】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 大数据分析与机器学习已成为当今商业决策和科学研究中的关键组成部分。本文将深入探讨大数据技术的背景和原则&#xff0c;并结合实例介绍一些常见的大数据分析和机器学习技术。 …

Redux的基础操作和思想

什么是Redux? Redux是JavaScript应用的状态容器&#xff0c;提供可预测的状态管理! Redux除了和React一起用外&#xff0c;还支持其它框架;它体小精悍(只有2kB&#xff0c; 包括依赖)&#xff0c;却有很强大的插件扩展生态! Redux提供的模式和工具使您更容易理解应用程序中的…

与用户同行!2023卡萨帝开启高端生活方式新时代

6月20日&#xff0c;2023思享荟暨卡萨帝品牌升级发布会在重庆国际博览中心举行。在经历了高端产品引领、高端品牌引领、高端场景引领后&#xff0c;卡萨帝启动全新品牌升级&#xff0c;持续与用户同行&#xff0c;开启高端生活方式引领的新时代。 现场&#xff0c;海尔智家副总…

量化交易:止盈策略与回测

我们买基金或股票的时候通常用最简单的策略进行决策&#xff1a;低买高卖&#xff0c;跌的多了就加仓拉低持有成本&#xff0c;达到收益率就卖出。 那么如何用代码表示这个策略呢&#xff1f;首先定义交易信号则是&#xff1a;0.5%时买入&#xff0c;目标止盈线是1.5%&#xf…

ELFK日志分析系统并使用Filter对日志数据进行处理

目录 一、 FilebeatELK 部署Filebeat 节点上操作 二、Filtergrok 正则捕获插件内置正则表达式调用自定义表达式调用 mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、 FilebeatELK 部署 Node1节点&#xff08;2C/4G&#xff09;&#xff1a;node1/192.168.15…

Django rest framework基本知识

使用pycharm生成Django项目后&#xff0c;会生成工程目录和app目录 工程目录下5个文件&#xff0c;settings.py是全局配置相关的 urls.py是路有相关的 app相关的目录 models.py 数据库ORM对应的模型类 serializers.py 序列化与反序列化处理 views.py 根据request进行…

手工测试没有前途,自动化测试会取代手工测试?

在测试行业&#xff0c;一个一直被讨论的问题就是&#xff1a;手工测试没有前途&#xff0c;自动化测试会取代手工测试&#xff1f; 首先说结论&#xff1a;自动化测试不会取代手工测试&#xff0c;这完全是两个维度的事情。为什么不会呢&#xff1f;我们需要从本源上说起。 什…

DINO-DETR匈牙利匹配与加噪过程学习记录

今天再来回顾一下DINO中匈牙利匹配与损失函数部分&#xff0c;该部分大致与DETR相似&#xff0c;却又略有不同。 为了查看数据方便&#xff0c;博主将num_query改为20&#xff0c;max_select值也为20。 匈牙利匹配过程 首先是数据送入匈牙利匹配中进行标签匹配过程了。 获取…

【Android自动化测试】Ui Automator技术(以对QQ软件自动发说说为例)

文章目录 一、引言二、了解&#xff08;Android官方文档&#xff09;1、UiDevice 类2、UI Automator API3、UI Automator 查看器 三、使用1、依赖2、代码 一、引言 描述&#xff1a;UI Automator 是一个界面测试框架&#xff0c;适用于整个系统上以及多个已安装应用间的跨应用…

react---react router 5 基本使用

目录 1.路由介绍 2.路由使用 3.路由组件和一般组件 4.Switch 单一匹配 5.解决二级路由样式丢失的问题 6.路由精准匹配和模糊匹配 7.Redirect路由重定向 1.路由介绍 路由是根据不同的 URL 地址展示不同的内容或页面&#xff0c;在 SPA 应用中&#xff0c;大部分页面结果…

理解Web3公链共识算法的原理与机制

Web3时代带来了去中心化、透明和安全的数字经济发展&#xff0c;而公链的共识算法是实现这一目标的关键。共识算法确保了公链网络中的节点对交易和状态的一致性达成共识&#xff0c;同时防止了恶意行为和双重支付等问题。本文将深入探讨Web3公链共识算法的核心原理与机制。 1.共…