驱动模块和printk函数

news2024/11/27 13:11:45

目录

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

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

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

相关文章

《人工智能.一种现代方法》原版精读思维导读-第一章

目录 书籍 前言部分 封面故事 完整目录 1. Intruduction简介 Whats AI The Foundations of AI The History of AI The State of the Art Risks and Benefits of AI Summary 2. Intelligent Agents 书籍 人工智能.一种现代方法 Artificial Intelligence. The Moder…

ArcGis系列-坐标系转换

Arcgis的工程项目可以添加各种类型的空间资源&#xff0c;比如数据库空间表、shp文件&#xff0c;每张空间表的坐标系可能都会有差异&#xff0c;把他们放到一个工程里时可以统一设置坐标系。 本文将介绍ArcGis三个需要坐标转换的场景&#xff1a; Arcgis Pro设置项目坐标GP分…

WPy64的Python开发环境中安装pinyin库方法举例和应用

WPy64的Python开发环境中安装拼音库&#xff08;pypinyin&#xff09;方法举例和应用 在Python开发环境中安装拼音库后&#xff0c;我们就可以实现对汉字的注音显示。下面以WPy64为例子&#xff0c;讲解pypinyin库的安装方法。 步骤&#xff1a; 一、找到WPy64所安装的目录中…

Vue中如何进行分布式事务管理与分布式事务解决方案

Vue中如何进行分布式事务管理与分布式事务解决方案 在分布式系统中&#xff0c;事务管理是一个非常重要的问题。如果没有良好的事务管理&#xff0c;分布式系统可能会导致数据不一致的问题。本文将介绍Vue中如何进行分布式事务管理以及分布式事务解决方案。 什么是分布式事务&…

二叉搜索树(Binary Search Tree)的模拟实现

前言 为什么要学习二叉搜索树呢&#xff1f;因为set 和 map的底层实际上就是一颗二叉搜索树&#xff0c;只不过是被进行了一些特殊的处理&#xff0c;所有了解二叉搜索树的底层实现有利于我们更好的理解的map和set的原理。二叉搜索树又叫二叉排序树&#xff0c;它或者是一颗空树…

数据库系统概述——第二章 关系数据库(知识点复习+练习题)

&#x1f31f;博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f99a;专栏&am…

SpringBoots利用redis实现防止接口幂等性重复提交

目录 什么是幂等性&#xff1f; 应用场景分析 解决办法 实际使用 什么是幂等性&#xff1f; 接口的幂等性就是用户对于同一个操作发起的一次请求或者多次请求的结果都是一致的&#xff0c;不会因为多次点击而产生副作用&#xff0c;比如说经典的支付场景&#xff1a;用户购…

一款超级给力的弱网测试神器—Qnet(上)

一、APP弱网测试背景 App在使用的过程中&#xff0c;难免会遇到不同的弱网络环境&#xff0c;像在公车上、在地铁、地下车库等。在这种情况下&#xff0c;手机常常会出现网络抖动、上行或下行超时&#xff0c;导致APP应用中出现丢包延迟&#xff0c;从而影响用户体验。 作为软…

推荐10款测试员常用的单元测试工具

前言 随着DevOp的不断流行&#xff0c;自动化测试慢慢成为Java开发者的关注点。因此&#xff0c;本文将分享10款优秀的单元测试框架和库&#xff0c;它们可以帮助Java开发人员在其Java项目上编写单元测试和集成测试。 1. JUnit 我绝对JUnit不需要太多的介绍了。即使您是Java…

Spring Security OAuth2.0认证授权 --- 高级篇

六、OAuth2.0 6.1、OAuth2.0介绍 OAuth&#xff08;开放授权&#xff09;是一个开放标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续…

基于Python接口自动化测试框架(初级篇)附源码

目录 引言 框架设计思路 框架结构 运行程序 总结 总结&#xff1a; 引言 很多人都知道&#xff0c;目前市场上很多自动化测试工具&#xff0c;比如&#xff1a;Jmeter&#xff0c;Postman&#xff0c;TestLink等&#xff0c;还有一些自动化测试平台&#xff0c;那为啥还要…

【Unity Shader】从入门到感慨万千(2)用C#画一个立方体

文章目录 一、构成一个立方需要多少个顶点?二、定义三角面的索引数组:三、定义UV坐标数组:四、最后构建Mesh:五、完整代码:一、构成一个立方需要多少个顶点? 这个问题是面试经常被问到的题。如上图,我们知道在几何中立方体有6个面,8个顶点。但在图形学中,顶点指的是模…

vulhub-struts2-S2-007 远程代码执行漏洞复现

漏洞描述 影响版本: 2.0.0 - 2.2.3 原理 当配置了验证规则 <ActionName>-validation.xml 时&#xff0c;若类型验证转换出错&#xff0c;后端默认会将用户提交的表单值通过字符串拼接&#xff0c;然后执行一次 OGNL 表达式解析并返回。例如这里有一个 UserAction&…

Vue中如何进行表单手机号验证与手机号归属地查询

Vue中如何进行表单手机号验证与手机号归属地查询 在Vue中&#xff0c;表单验证和数据处理是非常重要的功能&#xff0c;它可以帮助我们保证用户输入的数据的正确性和完整性。手机号验证和手机号归属地查询是常见的表单验证需求&#xff0c;本文将介绍如何在Vue中实现这两个功能…

13.推荐系统

例如一个电影推荐系统&#xff0c;一共有n个用户&#xff0c;m个电影&#xff0c;每部电影都有一定的特征&#xff0c;例如爱情片的比例、动作片的比例。n个用户对看过的电影进行评分&#xff0c;推荐系统如何给用户推荐新电影&#xff0c;预测用户对新电影的评分&#xff1f; …

三、IK分词器

目录 1、IK分词器下载 2、下载完毕后解压&#xff0c;放入到elasticsearch的plugins下即可 3、重启elasticsearch&#xff0c;可以看到ik分词器被加载了 4、也可以通过elasticsearch-plugin这个命令来查看加载进来的插件 5、使用kibana测试ik分词器 6、扩展配置ik分词器词典…

linux下安装rabbitmq及踩坑总结

下载erlang mq 下载地址 https://github.com/rabbitmq/erlang-rpm/releases?page7 https://github.com/rabbitmq/rabbitmq-server/tags?afterv3.8.12-beta.1 版本对应 1.官网地址 https://www.rabbitmq.com/download.html ** 2.文件上传 上传到/usr/local/software 目录…

STC15 Proteus仿真DHT11环境湿度采集报警系统STC15W4K32S4-0043

STC15 Proteus仿真DHT11环境湿度采集报警系统STC15W4K32S4-0043 Proteus仿真小实验&#xff1a; STM32 Proteus仿真DHT11环境湿度采集报警系统STC15W4K32S4-0043 功能&#xff1a; Protues版本&#xff1a;8.9 硬件组成&#xff1a;STC15W4K32S4单片机 LCD1602显示器DHT11…

UG\NX 二次开发 获取实体面的面积,测量面积

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取实体面的面积 UF_MODL_ask_mass_props_3d 效果: 代码: #include "me.hpp" //测量面积 double GetFaceArea(tag_t face) {// 抽取片体tag_t solid = NULL_TAG;UF_MODL_extract_face…

前端架构是什么?

文章目录 什么是前端架构前端架构的好处什么项目用前端架构必须要用前端架构嘛&#xff1f; 什么是前端架构 前端架构是指在前端开发中&#xff0c;设计和组织应用程序的基本结构和组件之间的关系的方法和原则。它涉及到如何组织代码、管理数据、处理业务逻辑以及实现用户界面…