第18章块设备驱动程序.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第18章块设备驱动程序资料

第18章 块设备驱动程序 除了字符设备、网络设备外,Linux系统中还有块设备。字符设备和块设备在内核中的结构有很大的不同,总体来说,块设备要比字符设备复杂很多。块设备主要包含磁盘设备、SD卡等,这些设备是Linux系统中不可缺少的存储设备。计算机中都需要这样的设备来存储数据,所以学会块设备驱动程序的写法是非常重要的。 18.1 块设备简介 本节对块设备的相关概念进行了简要的分析。理解这些概念对写块设备驱动程序具有十分重要的意义。 18.1.1 块设备总体概述 Linux内核中,I/O设备大致分为两类:块设备和字符设备。块设备将信息存储在固定大小的块中,每个块都有自己的地址。数据块的大小通常在512字节到4K字节之间。块设备的基本特征是每个块都能独立于其它块而读写。磁盘就是最常见的块设备。在Linux内核中,块设备与内核其他模块的关系如图所示: 18.1.2 块设备的结构 在写块设备驱动程序之前,了解典型块设备的结构是非常重要的。图显示的是磁盘的一个盘面,一些重要的概念将在下面讲述。 18.2 块设备驱动程序的架构 相对于字符设备来说,块设备的驱动程序架构要稍微复杂一些,其中涉及到很多重要的概念。对这些概念的理解是编写驱动程序的前提,本节将对块设备的整体架构进行详细讲解。 18.2.1 块设备加载过程 在块设备的模块加载函数中,需要完成的一些重要工作,这些工作涉及到的一些重要概念,将在后面的小节中进行讲解,本节的目的是为了给出一个整体的概念。块设备驱动加载模块中需要完成的工作如下图所示: 18.2.2 块设备卸载过程 在块设备驱动的卸载模块中完成与模块加载函数相反的工作。 (1)使用del_gendisk()函数删除gendisk设备,并使用put_disk()函数删除对gendisk设备的引用。 (2)使用blk_cleanup_queue()函数清除请求队列,并释放请求队列所占用的资源。 (3)如果在模块加载函数中使用了register_blkdev()注册设备,那么需要在模块卸载函数中使用unregister_blkdev()函数注销块设备,并释放对块设备的引用。 18.3 通用块层 通用块层是块设备驱动的核心部分,这部分主要包含块设备驱动程序的通用代码部分。本节将介绍通用块层的主要函数和数据结构。 18.3.1 通用块层 通用块层是一个内核组件,它处理来自系统其他组件发出的块设备请求。换句话说,通用块层包含了块设备操作的一些通用函数和数据结构。图是块设备加载函数中用到的一些重要数据结构,如通用磁盘结构gendisk、请求队列结构request_queue、请求结构request、块设备I/O操作结构bio、块设备操作结构block_device_operations等。这些结构将在下面的几小节详细简述。 18.3.2 alloc_disk()函数对应的gendisk结构体 现实生活中有许多具体的物理块设备,例如磁盘、光盘等。不同的物理块设备其结构是不一样的,为了将这些块设备公用属性在内核中统一,内核开发者定义了一个gendisk结构体来描述磁盘。gendisk是general disk的简称,一般称为通用磁盘。 18.3.3 块设备的注册和注销 为了使内核知道块设备的存在,需要使用块设备注册函数。在不使用块设备时,也需要注销块设备。块设备的注册和注销如下所述: 1.注册块设备函数register_blkdev() 2.注销块设备函数unregister_blkdev() 18.3.4 请求队列 简单的讲,一个块设备的请求队列就是包含块设备I/O请求的一个队列。这个队列使用链表线性的排列。请求队列中存储未完成的块设备I/O请求,并不是所有的I/O块请求都可以顺利的加入请求队列中。请求队列中定义了自己能处理的块设备请求限制。这些限制包括:请求的最大尺寸、一个请求能够包含的独立段数、硬盘扇区大小等。 18.3.5 设置gendisk属性中的block_device_operations结构体 在块设备中有一个和字符设备中file_operations对应的结构体block_device_operations。其也是一个对块设备操作的函数集合。 下面对这个结构体的主要成员进行分析。 1.打开和释放函数 2.I/O控制函数 3.介质改变函数 4.使介质有效函数 5.获得驱动器信息的函数 6.模块指针 18.4 不使用请求队列的块设备驱动 这里,有两个原因需要向读者介绍不使用请求队列的块设备驱动程序。第一个原因是,希望尽快的向读者展现一个完整的块设备驱动程序;第二个原因是,不使用请求队列的块设备驱动程序相对来说,比较简单。 18.4.1 不使用请求队列的块设备驱动程序的组成 块设备函数驱

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档