博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[OS] I/O设备

Posted on 2010-04-09 18:16  xuczhang  阅读(523)  评论(0编辑  收藏  举报

 

block && sector

block是块设备驱动程序中一次单独操作中所传送的一大块相邻字节,是硬件设备请求一次I/O操作所涉及的一组相邻字节。块的大小是2的幂,是扇区的倍数,但不能超过一个页框。

sector是硬件设备传送数据的基本单位,也就是不能传送少于一个扇区的数据。

扇区的大小在内核的hardsect_size表中:

image

块的大小存放在blksize_size表中:

image

每个块都需要自己的缓冲区,它是内核用来存放块内容的RAM存储器区。当设备驱动程序从磁盘读一个块时,就用从硬件设备中获得的值来填充相应的缓冲区;同样,当设备驱动程序向磁盘中写入一个块时,就用相关缓冲区的实际值来更新硬件设备。

 

buffer head(缓冲区首部)

包含内核处理缓冲区需要的所有信息。

image

 

block device request(块设备请求)

内核通过将相邻的磁盘请求合并在一起来提高性能。当请求传送一个新的数据块时,内核检查能否通过稍微扩展前一个一直处于等待状态的请求而满足新请求。块设备请求会被加入到一个等待队列,并把这个进程挂起,直到存放索引节点的块被传送为止。每个I/O操作都是异步处理的,以防止块设备驱动程序被挂起。每个块设备都有自己的一个请求队列,策略进程通过顺序扫描队列来优化请求。

request descriptor

尽管请求中的所有块必须在块设备上相邻,不过它们对应的缓冲区没必要在RAM中连续。segments就是是指在RAM中连续的缓冲区的段。queue是请求链表的指针。

image

 

image

在初始化阶段,每个块设备驱动程序通常会分配固定数目的请求描述符来处理即将来临的I/O请求。blk_init_queue()函数会建立大小相等的空闲请求描述符链表,一个用于READ,一个用于WRITE。

 

请求队列描述符(request_queue_t)

当内核初始化一个驱动程序时,会为驱动程序所处理的每一个请求队列都创建一个请求队列描述符。

当请求过多时就会发生请求描述符不够的情况,这样内核汇编请求的进程阻塞在request_queue的wait_for_request的等待队列中。

image

块设备低级驱动程序描述符(blk_dev_struct)

前面我们说内核为每个驱动程序建立一个请求队列,不过一个驱动程序可以被具有相同主设备号的设备共享,所以内核使用块设备低级驱动程序描述符来记录每个设备对应的请求队列。当然如果所有设备共享一个请求队列,就把它记录在request_queue中。否则通过queue和data两个变量来查找相应设备的请求队列。

image

 

ll_rw_block()

 

image

 

generic_make_request()对低级驱动程序发出请求。