第6章 设备驱动程序(2)

news2024/11/27 8:36:50

目录

6.3 和文件系统关联

6.3.1 inode的设备文件成员

6.3.2 标准文件操作

6.3.3 字符设备的标准操作

6.3.4 块设备的标准操作

6.4 字符设备操作

6.4.1 表示字符设备

6.4.2 打开设备文件

6.4.3 读写操作


本专栏文章将有70篇左右,欢迎+关注,查看后续文章。

6.3 和文件系统关联

普通文件和设备文件都通过相同接口访问。

6.3.1 inode的设备文件成员

每个文件都有一个inode,用于存储文件属性。

struct         inode {

        dev_t                 i_rdev;

                //主,从设备号。

        umode_t           i_mode;

                //文件类型。如socket,fifo,block,char,dir,link

        struct file_operations         *i_fop;

                //供VFS调用,用于读写该文件。

        union {

                struct block_device         *i_bdev;

                struct cdev                       *i_cdev;

        }

}

unsigned imajor(const struct inode *inode)

unsigned iminor(const struct inode *inode)

        这两个函数可分别得到主设备号,从设备号。

6.3.2 标准文件操作

当创建设备文件时(如mknod命令),各种文件系统都调用init_special_inode,以创建inode。

void   init_special_inode(struct inode   *inode,    umode_t mode,    dev_t    rdev)

{

        inode->i_mode    =    mode;

        if (S_ISCHR(mode)) {         //字符设备

                inode->i_fop    =    &def_chr_fops;

                inode->i_rdev    =     rdev;

        } else if (S_ISBLK(mode)) {         //块设备

                inode->i_fop     =     &def_blk_fops;

                inode->i_rdev    =    rdev;

        }

}

jffs2_mknod/ubifs_mknod/logfs_mknod:

        都会调用init_special_inode。

6.3.3 字符设备的标准操作

只有一个open操作, 没有读写操作。

struct file_operations         def_chr_fops = {

        .open    =    chrdev_open,

};

chrdev_open(struct inode *inode, struct file *filp)

        将调用struct file *filp->f_op->open(inode, filp),从而操作设备自身。

此处只定义一个open函数。因为其他read,write,mmap等函数通常由设备文件自定义实现。

6.3.4 块设备的标准操作

const struct file_operations    def_blk_fops = {

        .open    =     blkdev_open,

        .release    =     blkdev_close,

        .llseek    =     block_llseek,

        .read   =   do_sync_read,

        .write   =   do_sync_write,

        .aio_read   =   blkdev_aio_read,

        .aio_write   =   blkdev_aio_write,

        .mmap   =   generic_file_mmap,

        .fsync   =   blkdev_fsync,

        .unlocked_ioctl   =   block_ioctl,

        .splice_read   =   generic_file_splice_read,

        .splice_write   =   generic_file_splice_write,

};

VFS调用file_operations,而file_operations调用block_device_operations中的函数。

struct file_operations         def_blk_fops:

        所有块设备通用实现。

block_device_operations:

        对各种块设备具体独立实现。

6.4 字符设备操作

6.4.1 表示字符设备

struct         cdev {

        struct kobject        kobj;         //内核对象

        struct module        *owner;

        struct file_operations   *ops;

        struct list_head      list;         //连接所有表示该设备文件的inode

        dev_t                     dev;                 //设备号

        unsigned int          count;

}

6.4.2 打开设备文件

//创建设备文件时(mknod)

void   init_special_inode(struct inode   *inode,   umode_t   mode,   dev_t   rdev)

{

        if (S_ISCHR(mode))

                inode->i_fop   =   &def_chr_fops;         //创建设备文件时就已经初始化好

}

const struct file_operations   def_chr_fops   =   {

        .open   =   chrdev_open,

        .llseek   =   noop_llseek,

};

打开设备文件时执行chrdev_open。

int   chrdev_open(struct inode   *inode,   struct file   *filp)

{

        struct cdev   *cdev;

        struct kobject   *kobj;

        int   idx;

        kobj   =   kobj_lookup(cdev_map,   inode->i_rdev,   &idx);

                //查找设备文件对应kobject。

        cdev   =   container_of(kobj,   struct cdev,   kobj);

                //得到struct cdev实例。

        inode->i_cdev   =   cdev;

                //保存,后续次直接用,不用查找了。

        filp->f_op   =   fops_get(cdev->ops);

        filp->f_op->open(inode,   filp);

                //最终调用该字符设备自定义的open函数。

        return 0;

}

打开上述设备,依次对应如下函数。

创建设备文件时,创建一个struct inode。

打开设备文件时,创建一个struct file。

6.4.3 读写操作

不同设备各自实现struct file_operations中read/write函数。

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

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

相关文章

Vue项目中实现骨架占位效果-demo

创建组件 Skeleton.vue <template><div class"skeleton"><div class"skeleton-item" v-for"n in count" :key"n"></div></div> </template><script> export default {props: {count: {ty…

物联网技术-第3章物联网感知技术-3.2定位技术

目录 1.1位置信息和位置服务 1.1.1位置信息 1.1.2位置服务 1.2主流定位系统 1.2.1卫星定位系统&#xff08;Satellite Positioning Systems&#xff09; 1.2.2移动通信蜂窝基站定位&#xff08;Cellular Triangulation or Advanced Forward Link Trilateration&#xff09…

Unity2D游戏制作入门 | 14( 之人物实装攻击判定 )

上期链接&#xff1a;Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )-CSDN博客 上期我们聊到给人物添加三段攻击的动画&#xff0c;通过建立新的图层动画当我们按下攻击按键就会自动切换进攻击的动画&#xff0c;如果我们连续按下攻击键&#xff0c;我们还可以进行好几段的攻击…

Linux系统:信号概念 信号产生

Linux系统&#xff1a;信号概念 & 信号产生 信号概念信号产生软件信号killraiseabortalarm 硬件信号键盘产生信号硬件中断 信号概念 信号是进程之间事件异步通知的一种方式 在Linux命令行中&#xff0c;我们可以通过ctrl c来终止一个前台运行的进程&#xff0c;其实这就是…

利用K8S技术栈打造个人私有云

1.三个节点&#xff1a;master&#xff0c;slave&#xff0c;client 在Kubernetes集群中&#xff0c;三个节点的职责分别如下&#xff1a; Master节点&#xff1a; docker&#xff1a;用于运行Docker容器。 etcd&#xff1a;一个分布式键值存储系统&#xff0c;用于保存Kuberne…

微信投票源码系统+礼物+道具投票 无限多开 带完整的安装代码包以及搭建教程

系统概述 微信投票源码系统是一款基于先进技术开发的综合性投票平台&#xff0c;它不仅融合了传统投票的核心功能&#xff0c;还创新性地引入了礼物和道具投票机制&#xff0c;为用户带来了全新的投票体验。 该系统支持无限多开&#xff0c;这意味着用户可以根据实际需求&…

AI写真:ControlNet 之 InstantID

但是 IPAdapter-FaceId 目前只在 SD 1.5 模型上表现较好&#xff0c;SDXL 模型上的表现较差&#xff0c;不能用于实际生产。可是很多同学已经在使用SDXL了&#xff0c;而且SDXL确实整体上出图效果更好&#xff0c;怎么办&#xff1f; 这篇文章就来给大家介绍一个在SDXL中创作A…

多线程环境下,HashMap 为什么会出现死循环?

引言&#xff1a;HashMap作为一个常用的键值对存储结构&#xff0c;其内部实现在不同的JDK版本中有所演变&#xff0c;但其基本原理始终是通过哈希算法和数组来实现快速查找和存储。我们将探讨HashMap在多线程环境下出现死循环的根本原因&#xff0c;深入分析其中的数据结构特点…

网络安全(完整)

WAPI鉴别及密钥管理的方式有两种&#xff0c;既基于证书和基于预共享密钥PSK。若采用基于证书的方式&#xff0c;整个国产包括证书鉴别、单播密钥协商与组播密钥通告&#xff1b;若采用预共享密钥方式&#xff0c;整个国产则为单播密钥协商与组播密钥通告蠕虫利用信息系统缺陷&…

Tailwind CSS 响应式设计实战指南

title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计&#xff0c;涵盖博客、电商网站及企业官网的布局实例&#xff0c;包括头部导航、内容区域、侧边栏、页脚…

国产24位I2S输入+192kHz立体声DAC音频数模转换器CJC4344

CJC4344是一款立体声数模转换芯片&#xff0c;内含插值滤波器、multi bit数模转换器、输出模拟滤波器。CJC4344系列支持大部分的音频数据格式。CJC4344基于一个带线性模拟低通滤波器的四阶multi-bitΔ-Σ调制器&#xff0c;而且本芯片可以通过检测信号频率和主时钟频率&#xf…

新能源汽车的能源动脉:中国星坤汽车电缆在新能源汽车电气化中的应用!

随着新能源汽车行业的蓬勃发展&#xff0c;汽车电缆组件作为汽车电气系统的核心组成部分&#xff0c;其重要性日益凸显。中国星坤汽车电缆组件以其卓越的性能和创新技术&#xff0c;为汽车的电能传输、信号传递和控制提供了坚实的保障。本文将深入解析星坤汽车电缆组件的特性、…

PCB雕刻切割用德国自动换刀主轴SycoTec 4033 AC-ESD

随着电子行业的蓬勃发展&#xff0c;印刷电路板&#xff08;PCB&#xff09;的应用范围正在迅速扩大&#xff0c;涵盖了通信、计算机、消费电子等诸多领域。伴随着PCB的广泛应用&#xff0c;对PCB板切割加工技术的要求也日益严格。高速电主轴作为分板机的关键零部件之一&#x…

Pyqt QCustomPlot 简介、安装与实用代码示例(三)

目录 前言实用代码示例Line Style DemoDate Axis DemoParametric Curves DemoBar Chart DemoStatistical Box Demo 所有文章除特别声明外&#xff0c;均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nixgnauhcuy’s blog&#xff01; 如需转载&#xff0c;请标明出处&#x…

最新QT安装程序安装QT旧版本

1、下载Qt在线安装程序 官方下载地址&#xff1a;https://download.qt.io/official_releases/online_installers/ 也可以选择国内镜像地址下载&#xff0c;如清华大学的镜像地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/…

C#ListView的单元格支持添加基本及自定义任意控件

功能说明 使用ListView时&#xff0c;希望可以在单元格显示图片或其他控件&#xff0c;发现原生的ListView不支持&#xff0c;于是通过拓展&#xff0c;实现ListView可以显示任意控件的功能&#xff0c;效果如下&#xff1a; 实现方法 本来想着在单元格里面实现控件的自绘的…

python-日历库calendar

目录 打印日历 基本日历类Calendar TextCalendar类 HTMLCalendar类 打印日历 设置日历每周开始日期(周几) import calendarcalendar.setfirstweekday(calendar.SUNDAY) # 设置日历中每周以周几为第一天显示 打印某年日历 print(calendar.calendar(2024, w2, l1, c6, m…

事实证明:企业级中后台框架,大厂还是主角,小厂打酱油。

提及中后台框架&#xff0c;你或许能够想到antdesign、arcodesign还有fusion等等&#xff0c;这些都是背靠大厂&#xff0c;是市场的主角&#xff0c;而一些小厂框架往往是扮演者陪太子读书的角色。本文将给大家分享市面上有哪些大厂的中后台框架&#xff1f;为什么大厂要开源自…

MySQL修改用户权限(宝塔)

在我们安装好的MySQL中&#xff0c;很可能对应某些操作时&#xff0c;不具备操作的权限&#xff0c;如下是解决这些问题的方法 我以宝塔创建数据库为例&#xff0c;创建完成后&#xff0c;以创建的用户名和密码登录 这里宝塔中容易发生问题的地方&#xff0c;登录不上去&#…

29. 透镜阵列

导论&#xff1a; 物理传播光学&#xff08;POP&#xff09;不仅可以用于简单系统&#xff0c;也可以设计优化复杂的光学系统&#xff0c;比如透镜阵列。 设计流程&#xff1a; 透镜阵列建模 在孔径类型中选择“入瞳直径”&#xff0c;并输入2 在视场设定中。设置一个视场&…