本文来源于:

1. http://blog.csdn.net/jianchi88/article/details/7212370

2. http://blog.chinaunix.net/uid-27664726-id-3349507.html

一: 块设备概念:

      一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区。可以随机访问,块设备的访问位置必须能够在介质的不同区间前后移动。

二: 块设备相关属性:

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

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

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

三: 块设备被访问的分层实现

1. 首先块设备驱动是以何种方式对块设备进行访问的。在Linux中,驱动对块设备的输入或输出(I/O)操作,都会向块设备发出一个请求,在驱动中用request结构体描述。但对于一些磁盘设备而言请求的速度很慢,这时候内核就提供一种队列的机制把这些I/O请求添加到队列中(即:请求队列),在驱动中用request_queue结构体描述。在向块设备提交这些请求前内核会先执行请求的合并和排序预操作,以提高访问的效率,然后再由内核中的I/O调度程序子系统(即:上图中的I/O调度层)来负责提交I/O请求,I/O调度程序将磁盘资源分配给系统中所有挂起的块I/O请求,其工作是管理块设备的请求队列,决定队列中的请求的排列顺序以及什么时候派发请求到设备,关于更多详细的I/O调度知识这里就不深加研究了。
2. 块设备驱动又是怎样维持一个I/O请求在上层文件系统与底层物理磁盘之间的关系呢?这就是上图中通用块层(Generic Block Layer)要做的事情了。在通用块层中,通常用一个bio结构体来对应一个I/O请求,它代表了正在活动的以段(Segment)链表形式组织的块IO操作,对于它所需要的所有段又用bio_vec结构体表示。
3,块设备驱动又是怎样对底层物理磁盘进行反问的呢?上面讲的都是对上层的访问对上层的关系。Linux提供了一个gendisk数据结构体,用他来表示一个独立的磁盘设备或分区。在gendisk中有一个类似字符设备中file_operations的硬件操作结构指针,他就是block_device_operations结构体,他的作用相信大家已经很清楚了。

最新文章

  1. MES系统学习
  2. javascript学习笔记1-document.write
  3. BC#86 1003NanoApe Loves Sequence Ⅱ[two-pointer]
  4. 一个简单的MDI示范程序(Delphi)
  5. iOS开发——高级技术&二维码功能的实现
  6. C++ 数组作为函数参数时,传递数组大小的方法
  7. java程序的10个调试技巧
  8. 杭电oj 1009 FatMouse' Trade
  9. Android Studio ADB响应失败解决方法(2CTo.com)
  10. ACL权限控制列表
  11. I/O多路复用之select、poll、epoll
  12. Python环境——安装扩展库
  13. 更改了react-redux 官方网站的todolist结构
  14. 使用Angular2的Http发送AJAX请求
  15. C++ 日期时间使用
  16. Java中设置方法执行的超时时间java.util.concurrent.Future
  17. 两台openwrt 间的免登陆ssh
  18. Pycharm配置autopep8:自动调整代码为PEP8风格
  19. numpy计算路线距离
  20. 转载 Linux top命令详解

热门文章

  1. 九度oj题目1008:最短路径问题
  2. iOS-runtime-根据协议名调某一个类有与协议里面放的相同的方法
  3. HDU——2647Reward(DFS或差分约束)
  4. BZOJ 3196 二逼平衡树 ——树套树
  5. 常州模拟赛d3t2 灰狼呼唤着同胞
  6. 关于时区、时间戳引起的bug理解
  7. 点击不同按钮,加载不同的页面(不使用iframe的情况下)
  8. N*N数码问题
  9. 转 STL之vector的使用
  10. android自定义Activity窗体大小