字符设备驱动基础框架

news2024/11/16 19:33:49

一、总体框架

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.coloradmin.cn/o/1205625.html

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

相关文章

【SQLite】环境安装

SQLite - C/C SQLite简介 SQLite 是一种轻量级的嵌入式数据库引擎,它在程序中直接访问数据库文件而不需要独立的数据库服务器。以下是一些关于 SQLite 的简介信息: 嵌入式数据库引擎: SQLite 是一种嵌入式数据库引擎,这意味着它…

Windows系统下使用docker部署redis

使用虚拟机部署redis,虚拟机很占用电脑资源,所以选择使用docker对redis进行部署。 一、安装docker 安装链接:https://docker.p2hp.com/ 二、配置redis.conf文件 下载配置文件:https://download.redis.io/redis-stable/redis.con…

时间序列预测实战(十五)PyTorch实现GRU模型长期预测并可视化结果

往期回顾:时间序列预测专栏——包含上百种时间序列模型带你从入门到精通时间序列预测 一、本文介绍 本文讲解的实战内容是GRU(门控循环单元),本文的实战内容通过时间序列领域最经典的数据集——电力负荷数据集为例,深入的了解GRU的基本原理和…

信驰达科技加入车联网联盟(CCC),推进数字钥匙发展与应用

CCC)的会员。 图 1 深圳信驰达正式成为车联网联盟(CCC)会员 车联网联盟(CCC)是一个跨行业组织,致力于推动智能手机与汽车连接解决方案的技术发展。CCC涵盖了全球汽车和智能手机行业的大部分企业,拥有150多家成员公司。CCC成员公司包括智能手机和汽车制造…

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时,最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时,特别是在准备测试环境时,开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…

nodejs+vue+python+PHP+微信小程序-安卓-房产中介管理信息系统的设计与实现-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

Day29力扣打卡

打卡记录 美丽塔 II(前后缀分解 单调栈) 链接 大佬的题解 class Solution:def maximumSumOfHeights(self, a: List[int]) -> int:n len(a)suf [0] * (n 1)st [n] # 哨兵s 0for i in range(n - 1, -1, -1):x a[i]while len(st) > 1 and …

OSG查看版本信息和32or64位

使用osgversiond命令; -h,显示帮助; osg使用了OpenThreads库,也可以查看OpenThreads的版本号; -r 或 -read,读取贡献者名单文件;没看到啥; 然后进入VS开发人员命令提示;…

一行JavaScrip可以做什么?

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

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline

模型简介 本基线模型共分为三个部分: 基于CNN的判断每张人脸是否是说话人的模型;基于Transformer-Encoder的判断同一段对话中不同轮次的说话人关系的模型;和使用上述两个预测结果求解二次型优化问题的说话人识别求解器。 基于CNN的判断每…

OpenAI调查ChatGPT故障;向量搜索的优势与局限

🦉 AI新闻 🚀 OpenAI调查ChatGPT故障,发布新AI产品GPTs和GPT-4 Turbo 摘要:OpenAI的ChatGPT和其他服务出现故障,经过调查后发现是由于DDoS攻击导致的异常流量模式。OpenAI在首届开发者大会上发布了新的AI产品GPTs&am…

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

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

Maven 插件统一修改聚合工程项目版本号

目录 引言直接修改 pom.xml 的版本号的问题Maven 插件修改版本号开源项目微服务商城项目前后端分离项目 引言 在Maven项目中,我们通常有两种常见的方式来修改版本号:直接在pom.xml文件中手动编辑和利用Maven插件进行版本号调整。 本文将比较这两种修改…

如何用Python实现图像拼接画(把一堆小图拼成大图)

诸神缄默不语-个人CSDN博文目录 在这里的图像拼接画指的是一张大图由很多小图组成,效果就像这样: 原理:将大图拆成很多小块,每一块计算平均颜色,用平均颜色最相近的小图来替代,就可以。 直接遍历就可以&…

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

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

雷达波形及MATLAB仿真

文章目录 前言一、雷达波形二、Matlab 仿真1、SFW 的距离分辨率和距离模糊①、MATLAB 源码②、仿真结果 三、资源自取 前言 本文对雷达波形的内容以思维导图的形式呈现,有关仿真部分进行了讲解实现。 一、雷达波形 思维导图如下图所示,如有需求请到文章…

C#中.NET 6.0控制台应用通过EF访问已建数据库

目录 一、新建.NET 6.0控制台应用并建立数据库连接 二、下载并安装EF程序包 三、自动生成EF模型和上下文 1.Blog类模型 2.Post类模型 3.数据库上下文 四、设计自己的应用 VS2022的.NET6.0、.NET7.0框架下默认支持EF7(版本号7.0.13),除…

《QT从基础到进阶·二十五》界面假死处理

假如有这样一种情况,我们在主线程写了一个死循环,当程序运行到主线程的死循环代码后界面便卡死点了没有反应,这里提供几种方法处理界面假死的情况,保证比如主线程在执行死循环没有退出的时候点击界面不会卡死能继续执行其他功能。…

【c++】——类和对象(中)——实现完整的日期类

作者:chlorine 专栏:c专栏 我的花一定会开。 【学习目标】 拷贝复制——赋值运算符重载 目录 &#x1f393;运算符重载(-><...) &#x1f393;日期&天数 &#x1f393;前置和后置重载 我们完成了赋值运算符重载章节的学习&#xff0c;对operator关键字的使用有…

wpf devexpress项目中添加GridControl绑定数据

本教程讲解了如何添加GridControl到wpf项目中并且绑定数据 原文地址Lesson 1 - Add a GridControl to a Project and Bind it to Data | WPF Controls | DevExpress Documentation 1、使用 DevExpress Template Gallery创建一个新的空白mvvm应用程序&#xff0c;这个项目包括了…