Linux驱动(三):字符设备驱动之杂项

news2024/12/24 21:32:45

目录

  • 一、Linux设备分类
  • 二、设备号与字符设备的编码方式
    • 1.设备号
    • 2.字符设备的编码方式
  • 三、杂项字符设备驱动的初级编写


一、Linux设备分类

  Linux下一切皆文件,所有的硬件设备在Linux应用层中都会被抽象成文件,所有对硬件设备的操作到应用层中,也都会被抽象成文件的操作,设备文件通常会被放在/dev目录下。

类型作用
字符设备(Character Devices)字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少要实现open、close、read和write的系统调用。
块设备(Block Devices)和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备(例如磁盘)上能够容纳filesystem。在大多数的Unix系统中,进行I/O操作时块设备每次只能传输一个或多个完整的块,而每块包含512字节(或2的更高次幂字节的数据)。
网络设备(Network Devices)任何网络事物都需要经过一个网络接口形成,网络接口就是一个能够和其他主机交换数据的设备(网络设备)。接口通常是一个硬件设备,但也可能是个纯软件设备,比如回环(loopback)接口。

详解
1.字符设备
  字符设备是Linux设备类型中占比最多的设备,除了块设备和网络设备,其他设备基本都是字符设备,我们常常写的驱动代码,也往往是字符设备。之所以叫字符设备,是因为操作该设备时是通过字节一位一位(字符流)的去操作的。适用于实时数据流处理和设备交互。文件符号为c
  每一个字符设备在应用层的抽象文件也被叫做设备节点,在/dev下执行ls -l ,就可以看到很多创建好的设备节点。
在这里插入图片描述

– 代表普通文件
l 代表链接文件 ---- 快捷方式
c 代表字符设备
d 代表目录文件
b 代表块设备
p 代表管道
s 代表套接字

2.块设备
  与字符设备不同,块设备以固定大小的数据块进行数据传输。块设备通常用于存储设备,如硬盘、固态硬盘(SSD)、U盘等。适用于需要高效和灵活数据存取的应用场景。文件符号为b
3.网络设备
  网络设备用于连接和管理网络中的计算机和其他设备,网络设备的协同工作,确保网络的连接性、性能和安全性。Unix访问网络接口的方法仍然是给它们分配一个唯一的名字(比如eth0),但这个名字在filesystem中不存在对应的节点。内核和网络设备驱动程序间的通信,完全不同于内核和字符以及块驱动程序之间的通信,内核调用一套和数据包相关的函数socket,也叫套接字。
使用ifconfig命令,即可查看网络设备:
在这里插入图片描述

二、设备号与字符设备的编码方式

1.设备号

  在 Linux 系统中,设备号用于唯一标识设备文件,以便内核正确地访问硬件设备。设备号包括主设备号和次设备号,它们分别用于区分设备类型和具体设备实例。
示例
在这里插入图片描述
  简单来讲,设备号就是用来区分具体的硬件设备的。主设备号是先对硬件设备大致分个类,先确定该硬件设备具体属于哪一类,而次设备号就是用来再细分到具体哪一个设备。
主设备号固定是10,次设备号是0-255

2.字符设备的编码方式

在这里插入图片描述
  我们可以将操作系统大致分为三层,应用层、内核层以及硬件层。我们的所有界面操作都是应用层,所有的驱动代码都在内核层,所有具体的硬件在硬件层。应用层的所有操作,会先通过API接口反馈给驱动层,驱动代码运行后,最后才会反馈给具体的硬件进行需求实现。
  作为一个嵌入式软件工程师,我们所编写代码的顺序就是先写驱动后应用层。

编写字符设备驱动代码的方法大致有三种:
1.杂项字符设备驱动。用于处理与内核不直接相关的设备或功能的驱动程序,适用于各种简单或虚拟设备的实现,并为开发者提供了一种简便的方式来处理字符设备
2.Linux2.6 字符设备驱动 。 在 Linux 2.6 内核中编写字符设备驱动提供了一个强大且灵活的方式来与设备进行交互。虽然这种方法有许多优点,如清晰的接口和与文件系统的集成,但也存在一些缺点,如复杂性、性能开销和安全问题。
3.早期经典字符设备驱动。太老了,几乎被淘汰。

三、杂项字符设备驱动的初级编写

目标:通过编写代码实现初级open、close、read、write的驱动编写以及应用层的简单调用。

应用:
app.misc.c

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
	int fd =0;
	char buffer[100];
	const char *data = "Hello, this is a test write!";
	if(argc<2)
	{
		printf("请输入正确的参数\n");
		return -1;
	}
	fd = open(argv[1],O_RDWR);
	if(fd<0)
	{
		perror("open");
		return -1;
	}
	write(fd, data, strlen(data));
	read(fd, buffer, sizeof(buffer) - 1);
	close(fd);
	return 0;
}

驱动:
misc_test.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>

int my_open (struct inode *inode, struct file *fp)
{
	printk("Open ok\n");
	return 0;
}

int my_release (struct inode *inode, struct file *fp)
{
	printk("Release ok\n");
	return 0;
}
ssize_t my_read (struct file *fp, char __user *buf, size_t size, loff_t *off)
{
	printk("Read ok\n");
	return 0;
}
ssize_t my_write (struct file *fp, const char __user *buf, size_t size, loff_t *off)
{
	printk("Write ok\n");
	return 0;
}

struct file_operations my_filop = {
	.owner = THIS_MODULE,
	.open = my_open,
	.release = my_release,
	.read = my_read,
	.write = my_write
	
};

struct miscdevice my_misc={
	.minor=255,
	.name="my_open",
	.fops = &my_filop
};
	
static int __init my_open_init(void)
{
	int a=0;
	a = misc_register(&my_misc);
	if(a<0)
	{
		printk("my_misc_register error\n");
		return -ENODEV;
	}
	printk("杂项字符设备注册成功\n");
	return 0;
}

static void __exit my_open_exit(void)
{
	misc_deregister(&my_misc);
	printk("杂项字符设备注销成功\n");
}

module_init(my_open_init);
module_exit(my_open_exit);
MODULE_LICENSE("GPL");

结果:
在这里插入图片描述


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

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

相关文章

电脑垃圾箱删除的东西怎么找回来?介绍四个有效方法

在日常使用电脑的过程中&#xff0c;‌我们可能会不小心删除一些重要文件&#xff0c;‌而这些文件往往会被放入垃圾箱&#xff08;‌回收站&#xff09;‌。‌但有时候&#xff0c;‌我们可能会清空垃圾箱&#xff0c;‌导致这些文件看似永久丢失。‌其实&#xff0c;‌即使垃…

RFID光触发标签在汽车制造行业的深度应用

汽车制造行业作为现代工业的重要支柱&#xff0c;面临着日益激烈的市场竞争和不断提高的客户需求。传统的汽车制造管理方式在生产过程监控、零部件管理、质量追溯等方面存在诸多不足&#xff0c;而 RFID 光触发标签技术的出现为汽车制造行业的转型升级提供了有力的解决方案。 …

用友大易:以AI创新驱动招聘未来,引领2024 AIGC商业新趋势

更多内容前往个人网站&#xff1a;孔乙己大叔 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度渗透并重塑各行各业&#xff0c;其中&#xff0c;企业招聘领域也不例外。8月22日&#xff0c;由创业邦及2024 AGI商业趋势大会组委会主办的…

Mysql基础练习题 610.判断三角形 (力扣)

题目&#xff1a; 对每三个线段报告它们是否可以形成一个三角形 题目连接&#xff1a; https://leetcode.cn/problems/triangle-judgement/description/ 建表插入数据&#xff1a; Create table If Not Exists Triangle (x int, y int, z int) Truncate table Triangle in…

综合评价 | 基于层次-熵权-博弈组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 AHP层次分析法是一种解决多目标复杂问题的定性和定量相结合进行计算决策权重的研究方法。该方法将定量分析与定性分析结合起来&#xff0c;用决策者的经验判断各衡量目标之间能否实现的标准之间的相对重要程度&#…

SAP CN22释放物料的可用性的操作方法

SAP PS系统&#xff0c;CN22要释放网络的可用性&#xff08;直发物料号的需求&#xff09;&#xff0c; 必输要操作路径正确&#xff0c;或者操作的界面正确&#xff0c;否则保存后无法释放可用性。 先进入作业一览 然后进入作业的组件&#xff0c;对网络赋值的界面&#xff0…

实训day41(9.2)

[rootlocalhost ~]# docker stop 30 //停止nginx容器 30 [rootlocalhost ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

银河麒麟v10-sp3 安装Tomcat10最新版

tomcat官方地址---Apache Tomcat - Apache Tomcat 10 Software Downloads 下载这个即可 Core&#xff1a; 含义&#xff1a;Core代表Tomcat的核心程序&#xff0c;即Tomcat的正式二进制发布版本。这是大多数用户做开发或学习时应该下载的版本。用途&#xff1a;包含了Tomcat服…

53.x86游戏实战-XXX获取人物状态

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

一套高效、稳定的自卸车自动充电系统

随着工业自动化和智能化水平的不断提升&#xff0c;无人化作业已成为现代生产线的必然趋势。在山西地区的室内生产条件下&#xff0c;富唯智能凭借其在自卸车充电系统领域的深厚积累&#xff0c;成功设计出一套高效、稳定的自卸车自动充电系统&#xff0c;为工业领域带来革命性…

GeoScene Pro教程(003):手机拍摄带有坐标的照片批量上图到GeoScenePro

文章目录 1、创建【地图】工程2、添加底图3、照片转点4、更改符号5、设置时间动画1、创建【地图】工程 2、添加底图 选中【地图】选项卡下的【底图】按钮 ,选择适合的底图。 3、照片转点 1、查看图片GPS,右键【属性】,这样就可以确保照片可以转点 2、选中工具栏的【分析】…

公司注册资本金验资出具验资报告的看法

验资报告&#xff08;Capital Verification Report&#xff09;是注册会计师根据《中国注册会计师审计准则第1602号&#xff0d;验资》的规定&#xff0c;在对被审验单位的股东&#xff08;投资者、合伙人、主管部门等&#xff09;出资情况实施审验工作的基础上&#xff0c;所出…

typedef关键字讲解

目录&#xff1a; 1. typedef关键字 2. ui的位置 3.ui的使用 很多人都见过typedef&#xff0c;但是少有人知道它的作用&#xff0c;其实它的作用就是让关键词简单化 比如说当我们用到 unsigned int 时&#xff0c;每次都要打印这么长的关键词&#xff0c;十分耗费时间 有没…

Electron桌面应用与文件路径处理:从Git、SourceTree到TortoiseGit的安装与配置

更多内容前往个人网站&#xff1a;孔乙己大叔 在开发Electron桌面应用程序时&#xff0c;正确处理文件路径是一个至关重要的环节。特别是当涉及到需要调用外部程序&#xff08;如Git、SourceTree或TortoiseGit&#xff09;时&#xff0c;确保这些程序安装在正确的位置&#xff…

超越卷积滤波器,HyCoT利用Transformer捕捉高光谱图像的全局依赖性 !

近年来&#xff0c;基于学习的高光谱图像&#xff08;HSI&#xff09;压缩模型的开发引起了大量关注。现有的模型主要使用卷积滤波器&#xff0c;仅捕捉局部依赖性。 此外&#xff0c;它们通常会带来高昂的训练成本&#xff0c;并具有较大的计算复杂性。 为了解决这些问题&…

【全能型AI“草莓”来袭】探索未来AI市场的多元化与边界

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…

C语言基础(三十三)

1、链表排序之归并排序与线性搜索 测试代码&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h>// 链表节点结构体 typedef struct Node {int data;struct Node *next; } Node;// 插入节点到链表末尾 Node* insertNode(Node *hea…

2.6 时序与总线操作

&#x1f393; 微机原理考点专栏&#xff08;通篇免费&#xff09; 欢迎来到我的微机原理专栏&#xff01;我将帮助你在最短时间内掌握微机原理的核心内容&#xff0c;为你的考研或期末考试保驾护航。 为什么选择我的视频&#xff1f; 全程考点讲解&#xff1a;每一节视频都…

创建一个Spring MVC项目(配置,导入依赖,以及前端控制器)

Tomcat&#xff08;10.1.28&#xff09;配置 详细讲解&#xff01; 链接https://blog.csdn.net/or77iu_N/article/details/141266535?spm1001.2014.3001.5502 1、创建 Java Web 项目 File -> New -> Project 2、导入 Spring MVC 相关依赖 <dependency> <gro…

docker-compose 启动的harbor页面能登录,但是不能推送镜像

问题现象&#xff1a; docker-compose 安装的harbor&#xff0c;页面可以正常打开&#xff0c;但是不能推送镜像。 报错信息提示&#xff1a;connect: connection refused 故障原因&#xff1a; harbor.yml 中的external_url参数写错。这个是提供外部访问。页面请求地址和…