Linux设备驱动--块设备(一)之概念和框架

翻译 2012年03月22日 20:07:31
基本概念 

 块设备(blockdevice)

--- 是一种具有一定结构的随机存取设备,对这种设备的读写是按进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区。

字符设备(Character device)

---是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。他不具备缓冲区,所以对这种设备的读写是实时的

 

扇区(Sectors):任何块设备硬件对数据处理的基本单位。通常,1个扇区的大小为512byte。(对设备而言)

块  (Blocks):由Linux制定对内核或文件系统等数据处理的基本单位。通常,1个块由1个或多个扇区组成。(对Linux操作系统而言)

段(Segments):由若干个相邻的块组成。是Linux内存管理机制中一个内存页或者内存页的一部分。

页、段、块、扇区之间的关系图如下:

 

块设备驱动整体框架

 块设备的应用在Linux中是一个完整的子系统。

在Linux中,驱动对块设备的输入或输出(I/O)操作,都会向块设备发出一个请求,在驱动中用request结构体描述。但对于一些磁盘设备而言请求的速度很慢,这时候内核就提供一种队列的机制把这些I/O请求添加到队列中(即:请求队列),在驱动中用request_queue结构体描述。在向块设备提交这些请求前内核会先执行请求的合并和排序预操作,以提高访问的效率,然后再由内核中的I/O调度程序子系统来负责提交  I/O 请求,  调度程序将磁盘资源分配给系统中所有挂起的块 I/O  请求,其工作是管理块设备的请求队列,决定队列中的请求的排列顺序以及什么时候派发请求到设备

由通用块层(Generic Block Layer)负责维持一个I/O请求在上层文件系统与底层物理磁盘之间的关系。在通用块层中,通常用一个bio结构体来对应一个I/O请求

Linux提供了一个gendisk数据结构体,用来表示一个独立的磁盘设备或分区,用于对底层物理磁盘进行访问。在gendisk中有一个类似字符设备中file_operations的硬件操作结构指针,是block_device_operations结构体

当多个请求提交给块设备时,执行效率依赖于请求的顺序。如果所有的请求是同一个方向(如:写数据),执行效率是最大的。内核在调用块设备驱动程序例程处理请求之前,先收集I/O请求并将请求排序,然后,将连续扇区操作的多个请求进行合并以提高执行效率(内核算法会自己做,不用你管),对I/O请求排序的算法称为电梯算法(elevator algorithm)。电梯算法在I/O调度层完成。内核提供了不同类型的电梯算法,电梯算法有

1 noop(实现简单的FIFO,基本的直接合并与排序),
2 anticipatory(延迟I/O请求,进行临界区的优化排序),
3 Deadline(针对anticipatory缺点进行改善,降低延迟时间),
4 Cfq(均匀分配I/O带宽,公平机制)

PS:其实IO调度层(包括请求合并排序算法)是不需要用户管的,内核已经做好

相关数据结构

block_device:      描述一个分区或整个磁盘对内核的一个块设备实例 
gendisk:               描述一个通用硬盘(generic hard disk)对象。
hd_struct:             描述分区应有的分区信息 
bio:                        描述块数据传送时怎样完成填充或读取块给driver
request:                描述向内核请求一个列表准备做队列处理。 
request_queue:  描述内核申请request资源建立请求链表并填写BIO形成队列。

块设备驱动架构分析

1. 块设备概念:块设备是指只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍。常见的块设备包括硬件,SD卡,光盘等。 2. 块设备驱动的系统架构 2.1 系统架构---VFS VFS是...
  • coding__madman
  • coding__madman
  • 2016年06月06日 22:34
  • 3840

Linux块设备驱动

第十三章  Linux块设备驱动本章导读块设备是与字符设备并列的概念,这两类设备在Linux中驱动的结构有较大差异,总体而言,块设备驱动比字符设备驱动要复杂得多,在I/O操作上表现出极大的不同,缓冲、...
  • aaronychen
  • aaronychen
  • 2008年01月29日 21:50
  • 23078

Linux块设备驱动总结

《Linux设备驱动程序》第十六章 块设备驱动程序读书笔记 简介 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备 Linux内核视块设备为与字符设备相异的基本设备类型 Linu...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月26日 08:36
  • 1485

《Linux设备驱动程序》——块设备驱动程序

块设备驱动程序
  • Explorer_day
  • Explorer_day
  • 2014年12月05日 11:29
  • 1406

linux块设备驱动之实例

前两篇blog已经基本熟悉了块设备的相关结构,这里来总结下ldd3中提到的一些块设备驱动例题; 注册: sbull_major = register_blkdev(sbull_ma...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015年07月13日 00:39
  • 1941

Linux块设备驱动(五)————通用块层

通用块层是块设备驱动的核心部分,这部分主要包含块设备驱动程序的通过代码部分。 1、通用块层 通用块层是一个内核组件,他处理来自系统其他组件发出的块设备请求。换句话说,通用块层包含...
  • yangguoyu8023
  • yangguoyu8023
  • 2017年04月23日 14:56
  • 392

块设备驱动程序

块设备驱动程序就是支持以块的方式进行读写的设备。块设备和字符设备最大的区别在于读写数据的基本单元不同。块设备读写数据的基本单元为块,例如磁盘通常为一个sector,而字符设备的基本单元为字节。从实现角...
  • luckywang1103
  • luckywang1103
  • 2016年06月29日 17:46
  • 606

Linux块设备驱动程序原理

1.4  块设备驱动程序 1.4.1  Linux块设备驱动程序原理(1) 顾名思义,块设备驱动程序就是支持以块的方式进行读写的设备。块设备和字符设备最大的区别在于读写数据的基本单元不同。...
  • bingqingsuimeng
  • bingqingsuimeng
  • 2012年11月20日 10:19
  • 5127

linux块设备驱动程序

  • 2015年03月06日 15:29
  • 430KB
  • 下载

Linux设备驱动--块设备(三)之程序设计

块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为: int register_blkdev(unsig...
  • myths_0
  • myths_0
  • 2012年03月22日 20:02
  • 1245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux设备驱动--块设备(一)之概念和框架
举报原因:
原因补充:

(最多只允许输入30个字)