日期:2014-05-16  浏览次数:20548 次

linux内核--块I/O层

一、剖析一个块设备

    系统中能够随机访问固定大小数据片的硬件设备称作块设备,这些固定大小的数据片就称作块。另一种基本的设备类型是字符设备,字符设备按照字符流的方式有序访问,向串口和键盘属于字符设备。如果一个硬件设备是以字符流的方式被访问的话,那就是字符设备。两者的区别在于是否可以随机访问数据。

二、缓冲区和缓冲区头

    当一个块被调度内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相对于是磁盘快在内存中的表示。块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。

    缓冲区头的目的在于描述磁盘块和物理内存缓冲区之间的映射关系。这个结构体在内核中只扮演一个描述符的角色,说明从缓冲区到块的映射关系。

三、bio结构体

    内核中块I/O操作的基本容器有bio结构体表示,该结构体代表了正在现场的以片断链表形式组织的块I/O操作。一个片段是一小块连续的内存缓冲区。

四、请求队列

    块设备将他们挂起的块I/O请求保存在请求队列中,该队列由reaues_queue结构体表示,它定义在文件<linux/blkdev.h>中,包含一个双向链表以及相关控制信息。通过内核中像文件系统这样高层的代码将请求加入到队列中。请求对垒只要不为空,对列对应的块设备驱动程序就会从队列头获取请求,然后将其送入对应的块设备上去。请求对列表中的每一项都是一个单独的请求,由reques结构体表示。

五、I/O调度程序