linux内核驱动-在内核代码里添加设备结点

news2024/12/23 19:02:57

linux中,一切皆文件

我们在用户层用一些系统函数(如:fopen等等)时,会进入内核,内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的(驱动)函数

我们在前面已经讲了怎么创建一个内核程序,我们在驱动文件的目录下创建我们自己的驱动程序

比如我们创建一个test.c,代码如下

其实都是套模版,可以看到用不同颜色标出来的三个部分。

绿色(设备号):主设备号(最大值4095)与次设备号。(框选失误,52-54行为其他东西)

系统给我们定一个一个宏,如下。我们只需要调用它

蓝色(方法):

系统给我们定义了以下函数指针

我们只需要去重定义他们,就可以在用户层调用它。

方法结构体里的.open = open是结构体的一种特殊用法。我们只需要生命我们要调用的方法。类似于部分赋值。

红色:这是最基础的两个函数,缺一不可,一个初始化函数,一个注销函数。

来看看里面的一些东西

1.struct cdev结构体(链式)

操作系统给我们,方便管理维护驱动程序的结构体

2.cdev_add   添加设备号到cdev结构体

3.cdev_init   把方法结构体file_operations添加进cdev结构体

4.register_chrdev_region   注册设备驱动到操作系统

最后demo_exit就是一些注销的函数, 我们可以看到,这两个函数开始有一些不一样的东西

这是我们在编写内核驱动代码时特别的写法,目的就是告诉操作系统这个函数是内核的初始化以及追销的函数。在编写内核驱动代码时,很多函数都和用户层不一样,这时的代码编写更为谨慎。

出错处理

由于每一步出错都需要把前面产生的新空间全部释放,所以越后面的错误需要释放的就越多,使用goto语句把错误处理都放在后面,看起来没那么冗余

添加下载驱动

1.在同层目录(linux-2.6.32.2/drivers/char)下修改Kconfig文件

按模版修改即可

2.Makefile添加新建驱动文件

2.menuconfig(不懂的可以去搜一下)

它被称为内核活地图,可以根据可视化图形修改我们的驱动开关

我们直接在linux-2.6.32.2(解压出来的顶层目录)下make menuconfig    如图

根据以上路径找到我们的test

也可以直接  /  进入搜索我们的搜索。

上图  *  代表开启,可以通过Tab键或者  y/n选择是否开启,相应的在我们的顶层Makefile里就会改变

接下来直接Makefile编译就行了

 还是和以前的步骤一样

到这里我们的内核就添加了一个我们自己的驱动,但这个驱动文件里只有一些打印,我们想要实现硬件功能怎么办呢。

其实还是对寄存器的操作,然后把这些操作再移植到之前提到的系统给我们提供的函数(指针),最后去调用这些函数就行了。这里就不多说了,直接上代码。

在与板子挂载的nfs目录下创建程序

另一端链接板子,还是通过tftp下载,bootm命令运行uImage内核

然后在创建设备结点

就会发现我们/dev/目录下多了一个led的设备

我们在电脑客户端编译arm版可执行程序,此时板子也共享了这个程序,然后就可以直接运行了

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

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

相关文章

1.2.4 采用Java配置类管理Bean

本实战将演示如何使用Java配置类管理Bean,实现基于注解的IoC容器的配置。 创建新包 在net.huawei.spring根包里创建day04子包。 创建杀龙任务类 在day04子包里创建SlayDragonQuest类。在该类上不添加Component注解。 创建勇敢骑士类 在day04子包里创建BraveKnight…

07 Php学习:运算符

PHP 算术运算符 在 PHP 中,算术运算符用于执行基本的数学运算,包括加法、减法、乘法、除法、取余数,负数运算、取反和并置运算。以下是这些运算符的详细解释和示例: 加法运算符 :用于将两个数值相加。 $a 5; $b 3;…

【复现】用友NC-Cloud文件上传漏洞_70

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 用友NC Cloud大型企业数字化平台,深度应用新一代数字智能技术,完全基于云原生架构,打造开放、…

【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt信号和槽的其他说明及Lambda表达式 文章编号:Qt 学习笔记…

团结引擎+OpenHarmony 2 xlua编译篇

文章目录 前言一、下载 xlua 源码二、OpenHarmony SDK三、开干 前言 提示:我们的 app 鸿蒙化过程 需要用到 xlua ,目前没有适配 OpenHarmony 平台,所以需要重新编译一下。编译有多种方式,但是我只会这一种 就是使用 cmake。 一、下载 xlua 源…

【UE5 C++】访问修饰符public/protected/private继承

限制类与类之间访问级别的方法 public 在类中创建一个public的部分,即" public: ",public之下的所有内容都是公共的,可以在类之间访问 private(最常见) 如若没有指明修饰符,则默认为private 不能在类的外…

如何保证消息不丢失?——使用rabbitmq的死信队列!

如何保证消息不丢失?——使用rabbitmq的死信队列! 1、什么是死信 在 RabbitMQ 中充当主角的就是消息,在不同场景下,消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式,这些场景包括: 消息被拒绝访问&am…

what is tty?

waht is tty? 黑话:TTY 为什么使用Linux的时候CtrlC就会终止一个命令运行,ta是如何设置的? stty -a 桌面切换 CTRL ALT F1 – 锁屏 CTRL ALT F2 – 桌面环境 CTRL ALT F3 – TTY3 CTRL ALT F4 – TTY4 CTRL ALT F5 – TTY5 CTRL ALT F6 – TTY6

《C++程序设计》阅读笔记【7-堆和拷贝构造函数】

🌈个人主页:godspeed_lucip 🔥 系列专栏:《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学,回复C程序设计获取下载链接。 1 堆与拷贝构造函数1.1 概述1.2 分配堆对象1.3 拷贝构造函数1.3.1 默…

python画图Matplotlib和Seaborn

python画图Matplotlib和Season 一、Matplotlib1、介绍2、安装3、内容二、Seaborn1、介绍2、安装3、内容一、Matplotlib Matplotlib官网 1、介绍 Matplotlib 是一个 Python 的绘图库,用于创建高质量的二维图表和一些基本的三维图表。它广泛应用于科学计算、数据分析、工程学和…

面试经典算法系列之双指针1 -- 合并两个有序数组

面试经典算法题1 – 合并两个有序数组 LeetCode.88 公众号:阿Q技术站 问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#…

LangChain入门:17.使用 ConversationChain实现对话记忆功能

在默认情况下,无论是 LLM 还是代理都是无状态的,每次模型的调用都是独立于其他交互的。也就是说,我们每次通过 API 开始和大语言模型展开一次新的对话,它都不知道你其实昨天或者前天曾经和它聊过天了。 你肯定会说,不可…

全新智慧公厕解决方案,一键查看附近公厕情况

随着城市化进程的不断加快,人口密集地区的公共厕所需求日益增长,而传统的公厕管理方式已经无法满足人们对卫生、便利的需求。为了提升公共卫生设施的管理水平和服务质量,一家智能科技公司近日推出了全新智慧公厕解决方案,通过手机…

Cohere推出全新升级版RAG大型AI模型:支持中文,搭载1040亿参数,现开源其权重!

4月5日,知名类ChatGPT平台Cohere在其官方网站上发布了一款全新的模型——Command R。 据官方消息,Command R拥有1040亿个参数,并且支持包括英语、中文、法语、德语在内的10种语言。这一模型的显著特点之一在于其对内置的RAG(检索增…

【日期】获取当天以及未来三天的日期和周几

// 获取当天以及未来三天的日期和周几getDates() {const today new Date();const dayOfWeek ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];const todayDate today.toDa…

FreeRTOS任务切换学习

FreeRTOS任务切换学习 所谓任务切换,就是CPU寄存器的切换。假设当由任务A切换到任务B时,主要分为两步: 1:需暂停任务A的执行,并将此时任务A的寄存器保存到任务堆栈,这个过程叫做保存现场; 2&am…

Git 安装和配置

下载 Git 网址: https://git-scm.com/download 安装 Git 双击安装包, 开始安装. 修改安装路径, 选择非中文无空格路径: 开始安装: 安装成功: 配置 Git 安装完成后, 在任意文件夹内, 右键, 可以显示两个 Git 选项, 就说明安装成功了.

浅聊java集合框架中的java.util.LinkedList

java集合框架总览 Java集合框架是一个用来代表和操纵集合的统一架构,它为管理和组织对象的集合提供了一组类和接口。这个框架包含三个主要部分:接口、实现和算法。 接口: Collection:这是集合框架的根接口,定义了集…

1.2.3 利用注解配置类取代Spring配置文件

本实战将演示如何使用注解配置类取代Spring配置文件,实现基于注解的IoC容器的配置。 创建新包 在net.huawei.spring根包里创建day03子包。 拷贝类和接口 将day02子包里的类和接口拷贝到day03子包。 创建注解配置类 在day03子包里创建SpringConfig类。在该类上添加…

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中,字符串是一种常见的数据类型,用于存储文本数据。字符串变量可以包含字母、数字、符号等字符,并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息: 定义字符串变量&#xff1…