字符设备驱动基础框架

一、总体框架

1.Linux字符设备驱动工作原理图

2.驱动使用端

3.驱动实现端

二、各部分详解

1.VFS层

1) inode结构体

        在Unix/Linux操作系统中,每个文件都由一个inode(索引节点)来索引。inode是特殊的磁盘块,它们在文件系统创建时就已经生成。inode的数量限制了文件系统中可以存储的文件/目录的总数。

        每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

inode包含以下信息:

        文件的字节数

        文件拥有者的User ID

        文件的Group ID

        文件的读、写、执行权限

        文件的时间戳,包括:

                ctime:inode上一次变动的时间

                mtime:文件内容上一次变动的时间

                atime:文件上一次打开的时间

        链接数,即有多少文件名指向这个inode

        文件数据block的位置


        inode的存在使得文件名和inode号码分离,这种机制导致了一些Unix/Linux系统特有的现象。例如,移动文件或重命名文件,只是改变文件名,不影响inode号码。打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

        总的来说,inode在文件系统中起着至关重要的作用,它存储了文件的元信息,并为文件的存储和访问提供了基础。

2) struct file结构体

        struct file是Linux内核中的一个重要结构体,它代表一个已经打开的文件。系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。

        struct file的定义在include/linux/fs.h中。在内核创建和驱动源码中,struct file的指针通常被命名为file或filp

struct file的一些重要成员包括:

        文件描述符(fd):fd只是一个小整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。

        缓冲区:根据应用程序对文件的访问方式,即是否存在缓冲区,对文件的访问可以分为带缓冲区的操作和非缓冲区的文件操作。


        总的来说,struct file结构体在Linux内核中起着至关重要的作用,它为文件的打开、读写等操作提供了基础。在编写设备驱动或者进行内核开发时,理解和掌握struct file结构体的使用是非常重要的。

2.字符设备的描述和操作

1) cdev结构体

        在Linux内核中,cdev结构体用于描述一个字符设备。cdev结构体的定义如下:

struct cdev {
    struct kobject kobj; // 内嵌的内核对象
    struct module *owner; // 该字符设备所在的内核模块的对象指针
    const struct file_operations *ops; // 该结构描述了字符设备所能实现的方法,是极为关键的一个结构体
    struct list_head list; // 用来将已经向内核注册的所有字符设备形成链表
    dev_t dev; // 字符设备的设备号,由主设备号和次设备号构成
    unsigned int count; // 隶属于同一主设备号的次设备号的个数
};

        在Linux字符设备驱动中,模块加载函数通过register_chrdev_region()或alloc_chrdev_region()来静态或者动态获取设备号,通过cdev_init()建立cdev与file_operations之间的连接,通过cdev_add()向系统添加一个cdev以完成注册。用户空间访问该设备的程序通过Linux系统调用,如open(),read(),write(),来“调用”file_operations来定义字符设备驱动提供给VFS的接口函数。

        总的来说,cdev结构体在Linux内核中起着至关重要的作用,它为字符设备的管理提供了基础。在编写设备驱动或者进行内核开发时,理解和掌握cdev结构体的使用是非常重要的。

2)file_operations结构体

        file_operations结构体在Linux内核中的定义位于linux/fs.h头文件中。它用来存储驱动内核模块提供的对设备进行各种操作的函数的指针。该结构体的每个域都对应着驱动内核模块用来处理某个被请求的事务的函数的地址。

        例如,每个字符设备需要定义一个用来读取设备数据的函数。这个结构的每一个成员都对应着一个系统调用。读取file_operation中相应的函数指针,接着把控制权转交给函数,从而完成了Linux设备驱动程序的工作。

        在系统内部,I/O设备的存取操作通过特定的入口点来进行,而这组特定的入口点恰恰是由设备驱动程序提供的。通常这组设备驱动程序接口是由结构file_operations结构体向系统说明的。

        file_operations结构体中的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux的open()、write()、read()、close()等系统调用时最终被内核调用。

        总的来说,file_operations结构体在Linux内核中起着至关重要的作用,它为设备的各种操作提供了基础。在编写设备驱动或者进行内核开发时,理解和掌握file_operations结构体的使用是非常重要的。

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

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

相关文章

windows系统用于 SDN 的软件负载均衡器 (SLB)

适用于:Azure Stack HCI 版本 22H2 和 21H2;Windows Server 2022、Windows Server 2019、Windows Server 2016 软件负载均衡器包括哪些内容? 软件负载均衡器提供以下功能: 适用于北/南和东/西 TCP/UDP 流量的第 4 层 (L4) 负载均…

聚观早报 |京东11.11公布成绩单;2023数字科技生态大会

【聚观365】11月13日消息 京东11.11公布成绩单 2023数字科技生态大会 TikTok深受英国中小企业青睐 周鸿祎称大模型2年内可“进”智能汽车 双11全国快递业务量达 6.39 亿件 京东11.11公布成绩单 京东11.11公布成绩单:截至11月11日晚23:59,2023年京东…

Docker 中的端口

Docker 中的端口 0.0.0.0:8080->80/tcp ,主机(即运行 Docker 的机器)监听8080端口,如果有请求转发到容器的 80 端口上去。 详细解释一下: 0.0.0.0:8080->80/tcp :这是一个端口映射规则。 0.0.0.0:80…

【中间件篇-Redis缓存数据库06】Redis主从复制/哨兵 高并发高可用

Redis高并发高可用 复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Re…

SparkSQL之Analyzed LogicalPlan生成过程

经过AstBuilder的处理,得到了Unresolved LogicalPlan。该逻辑算子树中未被解析的有UnresolvedRelation和UnresolvedAttribute两种对象。Analyzer所起到的主要作用就是将这两种节点或表达式解析成有类型的(Typed)对象。在此过程中,…

打开word文档报错,提示HRESULT 0x80004005 位置: 部分: /word/comments.xml,行: 0,列: 0

某用户遇到这样一个奇怪的问题,就是回复完word的批注后,保存文档再打开就会报错,提示很抱歉,无法打开XXX,因为内容有问题。,详细信息提示HRESULT 0x80004005 位置: 部分: /word/comments.xml,行: 0,列: 0 c…

java学习part02一些特性

17-Java语言概述-Java语言的特点和JVM的功能_哔哩哔哩_bilibili 1.java优点 跨平台性 在jvm上运行 2.jvm 2.1实现跨平台性 不需要对每一种指令集编写编译器,只需要针对jvm编程,jvm会自动转换 2.2内存回收 内存溢出:用的内存太多已经占满了&…

No199.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Seaborn数据可视化综合应用Basemap和Seaborn在线闯关_头歌实践教学平台

Seaborn数据可视化综合应用Basemap和Seaborn 第1关 Seaborn第2关 Seaborn图形介绍第3关 Basemap 第1关 Seaborn 任务描述 本关任务:编写一个绘制每个月销售总额的折线图。 编程要求 本关的编程任务是补全右侧上部代码编辑区内的相应代码,根据输入文件路…

微信小程序用户隐私API

用户隐私保护 由于用户隐私保护的政策执行,我们在调用涉及到用户隐私的API时,未更新用户隐私保护协议是无法直接调用的,小程序会默认判断是否更新用户隐私保护 ,并根据用户隐私保护中的协议来判断是否可以调用对应的API&#xff…

基于flask+bootstrap4实现的注重创作的轻博客系统项目源码

一个注重创作的轻博客系统 作为一名技术人员一定要有自己的博客,用来记录平时技术上遇到的问题,把技术分享出去就像滚雪球一样会越來越大,于是我在何三博客的基础上开发了[l4blog],一个使用python开发的轻量博客系统,…

rabbitMq创建交换机,以及路由键绑定队列教程

创建交换机: 创建队列: 创建路由,绑定到交换机: 补充: 创建新用户后,记得点进用户中,那两个set都点击一下; 还有配置代码连接的时候,连的端口为5672,可不…

STM32与RTOS的整合:实时操作系统在嵌入式开发中的应用

随着各种嵌入式系统应用的日益复杂和对实时性要求的提高,使用实时操作系统(RTOS)成为嵌入式开发中的一种重要选择。STM32微控制器作为一种强大的嵌入式处理器,与各种RTOS相结合,能够提供更高效、可靠并且易于维护的系统…

eNSP-打开华为USG6000V1防火墙web管理页面方法

一、本地打开防火墙web管理页面 1.先在ensp中启动USG6000V1防火墙,启动后,需要输入原始username和password(username:admin,password:Admin123),并修改原始密码后,才能配…

【中间件篇-Redis缓存数据库08】Redis设计、实现、redisobject对象设计、多线程、缓存淘汰算法

Redis的设计、实现 数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的…

【Spring Boot】034-Spring Boot 整合 JUnit

【Spring Boot】034-Spring Boot 整合 JUnit 文章目录 【Spring Boot】034-Spring Boot 整合 JUnit一、单元测试1、什么是单元2、什么是单元测试3、为什么要单元测试 二、JUnit1、概述简介特点 2、JUnit4概述基本用法 3、JUnit5概述组成 4、JUnit5 与 JUnit4 的常用注解对比 三…

计算机网络期末复习-Part5

1、CRC计算 看例题:待发送序列为101110,生成多项式为X31,计算CRC校验码 先在待发送序列末尾添加与生成多项式次数相同的零,在上述例子中,生成多项式是X^3 1,所以需要添加3个零,待发送序列变成…

一行JavaScrip可以做什么?

说在前面 JavaScript 提供了许多方便的方法和操作符来简化常见的任务,使得编程变得更加高效和便捷。无论是数学计算、字符串处理还是数据操作,JavaScript 都能帮助我们以简洁的方式实现所需功能。 代码 1、生成指定范围内的随机整数 const randomInt …

tensorboard报错解决:No dashboards are active for the current data set

版本:tensorboard 2.10.0 问题:文件夹下明明有events文件,但用tensorboard命令却无法显示。 例如: 原因:有可能是文件路径太长了,导致系统无法读取文件。在win系统中规定,目录的绝对路径不得超…

WordPress 文档主题模板Red Line -v0.2.2

此主题作为框架,做承载第三方页面之用,例如飞书文档等, 您可以将视频图片等资源放第三方文档上,通过使用此主题做目录用。 此主题使用前后端分离开发,也使用了一些技术尽量不影响正常的SEO,还望注意。 源码…