字符设备驱动程序

应用程序是调用C库中的open read write等函数。而为了操作硬件,所以引入了驱动模块。

构建一个简单的驱动,有一下步骤。

  1. 创建file_operations

  2. 申请设备号

  3. 注册字符设备驱动,

  4. 驱动入口

  5. 驱动出口

检查数据是否到来的方式:

  1. 查询方式

  2. 休眠唤醒方式

     如果设备出现异常而无法唤醒时,则将永远处于休眠状态。

  3. poll机制

     如果没有被唤醒,则在一定时间内可自己唤醒。

  4. 异步通知(信号)

而以上的几种方式通用性不高,为了增强通用性,使用输入子系统。

块设备驱动程序

  在读取硬盘的时候,磁头需要定位,但是定位是非常损耗时间的。

  flash的操作也是一样的。在写之前需要擦除整块。

  如果我们现在进行一下操作:1.写扇区0  2.写扇区1

  1. 写扇区0:

    读出整块到buffer

    修改buffer中相应的内容,

    擦除整块

    写入整块

  2.读扇区1则是重复上述步骤。

而上述的方法在操作的时候太过于繁杂,浪费时间。所以操作系统在处理的时候优化了一次。

  1. 把读写放入队列

  2.调用队列的处理函数(优化/调顺序/合并)

块设备驱动程序框架:

---------------------------------------------------------(文件的读写)

  app:  open、write、read等          (把对文件的读写转化为对扇区的读写)

----------------------------------------------------------

  文件系统: vfat、ext2、ext3、yaffs2、jffs2

------------------ ll_rw_block --------------------------

  块设备驱动程序

----------------------------------------------------------

  硬件:  硬盘、Flash

----------------------------------------------------------

分析 ll_rw_block :(1. 把“读写”放入队列     2. 调用队列的处理函数( 优化 / 调顺序 / 合并 ))

  for (i = 0; i < nr; i++) {

    struct buffer_head *bh = bhs[i];

    submit_bh(WRITE, bh);

      struct bio *bio;    //使用bh来构造bio (block input/output)

      submit_bio(rw, bio);  //通用的构造请求:使用bio来构造请求(request)

        generic_make_request(bio);

          __generic_make_request(bio);

            request_queue_t *q = bdev_get_queue(bio->bi_bdev);  //找到队列

            ret = q->make_request_fn(q, bio);  //默认函数是__make_request

              __make_request

                elv_merge(q, &req, bio);    //尝试合并

                init_request_from_bio(req, bio);    //如果尝试合并不成功 使用bio构造请求

                add_request(q, req);        //把请求放入队列

                __generic_unplug_device(q);  //执行队列

                  q->request_fn(q);    //调用队列的处理函数

  }

如何编写块设备驱动程序呢?

1. 分配gendisk

2. 设置

2.1分配/设置队列: request_queue_t   //提供读写能力

  blk_init_queue

2. 2 设置gendisk其他信息        //提供属性:容量,扇区大小等

3. 注册: add_disk

嵌入式Linux驱动学习之路(二十一)字符设备驱动程序总结和块设备驱动程序的引入的更多相关文章

  1. 嵌入式Linux驱动学习之路(二十七)字符设备驱动的另一种写法

    之前讲的字符设备驱动程序,只要有一个主设备号,那么次设备号无论是什么都会和同一个 struct file_operations 结构体对应. 而本节课讲的是如何在设备号相同的情况下,让不同的次设备号对 ...

  2. 嵌入式Linux驱动学习之路(二十四)Nor Flash驱动程序

    Nor Flash和Nand Flash的不同: 类型 NOR Flash  Nand Flash  接口 RAM-like,引脚多 引脚少 容量 小(1M.2M...) 大(512M.1G) 读 简 ...

  3. 嵌入式Linux驱动学习之路(二十三)NAND FLASH驱动程序

    NAND FLASH是一个存储芯片. 在芯片上的DATA0-DATA7上既能传输数据也能传输地址. 当ALE为高电平时传输的是地址. 当CLE为高电平时传输的是命令. 当ALE和CLE都为低电平时传输 ...

  4. 嵌入式Linux驱动学习之路(二十)USB设备驱动

    USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...

  5. 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序

    一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...

  6. 嵌入式Linux驱动学习之路(二十二)用内存模拟磁盘

    安装驱动后,可在/dev/目录下发现已经生成了相应的设备文件. 格式化设备:mkdosfs /dev/ramblock. 挂载设备. 读写设备 . 驱动程序代码: /***************** ...

  7. 嵌入式Linux驱动学习之路(二十六)DM9000C网卡驱动程序

    基于DM9000C的原厂代码修改dm9000c的驱动程序. 首先确认内存的基地址 iobase. 确定中断号码. 打开模块的初始化函数定义. 配置内存控制器的相应时序(结合DM9000C.C的手册). ...

  8. 嵌入式Linux驱动学习之路(二)u-boot体验

    u-boot工程简介 现在的u-boot支持PowerPC.ARM.X86.MIPS体系结构的上百种开发板,已经称为功能最多.灵活性最强,并且开发最积极的开源Bootloader.目前由DENX的Wo ...

  9. 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制

    实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...

随机推荐

  1. 浅谈Slick(1)- 基本功能描述

    Slick (Scala language-integrated connection kit)是scala的一个FRM(Functional Relational Mapper),即函数式的关系数据 ...

  2. Lind.DDD.Domain.IOwnerBehavor对实体的意义

    回到目录 对于Lind.DDD架构,我之前写了不少文章,对于它的Domain模式也介绍了不少,像之前的IEntity,ILogicDeleteBehavor,IModifyBehavor,IStatu ...

  3. MongoDB常用操作--集合2

    1.查询集合中的文档,可以使用命令 db.集合名称.find({条件}),或者使用 db.集合名称.findOne() 查询第一个文档 2.查询集合中的文档,返回某些特定的键值 3.查询集合中的文档 ...

  4. JavaScript-数组去重由慢到快由繁到简

    indexOf去重 Array.prototype.unique1 = function() { var arr = []; for (var i = 0; i < this.length; i ...

  5. 西南大学校园GIS平台

    系统架构是B/S,开发语言是C#.silverlight,开发平台是.NET,数据库为sqlserver,这是我读研究生时候自己做的作品,以自己的母校为地图,进行GIS相关的功能分析,核心的模块有:空 ...

  6. iOS导航栏标题颜色

    按钮的颜色 [self.navigationBar setTintColor:[UIColor whiteColor]]; 标题颜色.字体 [self.navigationBar setTitleTe ...

  7. java设计模式--策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 本文地址:http:// ...

  8. 一步步搭建react-native环境(苹果OS X)

    因重新升级了系统,一步步搭建react-native环境. 1.安装Homebrew 打开终端命令->ruby -e "$(curl -fsSL https://raw.githubu ...

  9. Linux磁盘空间监控告警

    Linux系统中需要监控磁盘各分区的使用情况,避免由于各种突发情况,造成磁盘空间被消耗殆尽的情况,例如某个分区被Oracle的归档日志耗尽,导致后续的日志文件无法归档,这时ORACLE数据库就会出现错 ...

  10. mongo DB的一般操作

    最近接触了一些mongoDB .将一些指令操作记录下来,便于查询和使用 登录 [root@logs ~]# mongo -u loguser -p log123456 --authentication ...