在块设备上的操作,涉及内核中的多个组成部分,如图1所示。假设一个进程使用系统调用read()读取磁盘上的文件。下面步骤是内核响应进程读请求的步骤;
(1)系统调用read()会触发相应的VFS(Virtual Filesystem Switch)函数,传递的参数有文件描述符和文件偏移量。
(2)VFS确定请求的数据是否已经在内存缓冲区中;若数据不在内存中,确定如何执行读操作。
(3)假设内核必须从块设备上读取数据,这样内核就必须确定数据在物理设备上的位置。这由映射层(Mapping Layer)来完成。
(4)此时内核通过通用块设备层(Generic Block Layer)在块设备上执行读操作,启动I/O操作,传输请求的数据。
(5)在通用块设备层之下是I/O调度层(I/O Scheduler Layer),根据内核的调度策略,对等待的I/O等待队列排序。
(6)最后,块设备驱动(Block Device Driver)通过向磁盘控制器发送相应的命令,执行真正的数据传输。
对于(1)、(2)两个步骤,在Linux虚拟文件系统中,我们讨论了VFS(Virtual Filesystem Switch)主要数据结构和操作,结合相关系统调用(如sys_read()、sys_write()等)的源码,我们不难理解VFS层相关的操作和实现。而对于第(3)步中的Mapping Layer需要结合具体的文件系统解释,我们暂时不考虑。
本文主要分析(4)步,就是通用块设备层。
完整文档下载:Linux通用块设备层
您好
我閱讀了您此篇,以及write過程、read過程,還有此網站內的其它文章
發現您對於Linux I/O這塊有很深的功力,尤其是分析整個來龍去脈的過程
也看到您有很多文章都有在使用dump stack的方式去追蹤資料在內核中的調度過程(我實在很好奇我該怎樣得到跟您一樣的資訊,例如使用fio 對一個Hdd做read data時要如何顯現那些stack information,若您可以告知我實際該如何做,或是告知我該以怎樣的關鍵字查詢這方面的資料,我會很感謝的)
另外,我對於Linix I/O這部分也很有興趣,想請教您除了使用dump stack的方式來分析整個過程以外,有沒有推薦的書單呢?我只能算是一個初學者而已,如果您能推薦我書單的話我會很感謝您的
dumpstack方式,是我自己摸索出来的。看内核代码,边看便动手实践;遇到不清晰的地方,可以动手实验。
书单,基本很经典的内核书籍都不错,如《深入理解Linux内核》等。