linux 块设备驱动

来源:互联网 发布:saa7104监控软件 编辑:程序博客网 时间:2024/05/16 09:28

虚拟文件系统(vfs)层类似于面向对象中的“抽象基类”的概念,而下面一个个具体的文件系统就相对于这个抽象基类

的"派生类",所有文件操作如 open, read, write等在vfs中只是实现了一个类似于“纯虚函数”的接口,针对具体的文件

系统,就会使用其派生类中被“改写”的“虚函数”。

块设备和字符设备

相同之处:

    1 . 都经过vfs向用户空间提供上述中的文件操作接口open,read,write等。

不相同之处:

    1 . 字符设备是在字符设备驱动程序中实现了file_operations中的函数指针所指的函数,块设备中是在vfs

        下的不同文件系统层(yaff2, ext3等)是实现这些file_operations,再下层是块设备驱动层。

    2 . 字符设备的输入是顺序的,而块设备有可能是多个随机的 的访问。

    3 . 块设备驱动是不关心文件操作的,文件操作在具体的文件系统实现,块设备驱动只关心要上层发下来的操作

         请求,并去响应这些请求。

块设备驱动-IO调度

    如果简单地以内核产生请求的次序直接将请求发向块设备的话,性能肯定让人难以接受。磁盘寻址是整个计算件

    中最慢的操作之一,每次寻址定位硬盘磁头到特定块上的某个位置,需要花费不少时间。所以尽量缩短寻址时间

    是提高系统性能的关键。

    为了优化寻址操作,内核既不会简单地按请求接收次序,也不会立即将其提交给磁盘,相反,它会在提交前,先执

    行名为合并与排序的预操作,这种预操作可以极大地提高系统的整体性能,在内核中负责提交I/O请求的子系统就

    称为I/O调度程序。

                请求扇区1                            请求扇区1

                请求扇区10                         请求扇区4

                请求扇区7                            请求扇区7

                请求扇区4                            请求扇区10

            I/O调度程序操作前  -->  I/O调度程序操作前

关于块设备驱动的request和bio

bio用户发来的块设备I/O操作。这些bio被放到一个队列里面,这个队列就够成了一个requst,那么对于块设备驱动来

讲就是去处理这些request,处理完后并通知用户。

块设备中的多个请求request会被调度算法进行整合,块设备驱动会从请求队列取这些request,并处理这些一个个被

整合后的request(这些请求形成一个请求队列),一个request中可能包含多个bio,

0 0