设备管理块设备分析.docx

上传人:b****6 文档编号:12643175 上传时间:2023-06-06 格式:DOCX 页数:12 大小:400.56KB
下载 相关 举报
设备管理块设备分析.docx_第1页
第1页 / 共12页
设备管理块设备分析.docx_第2页
第2页 / 共12页
设备管理块设备分析.docx_第3页
第3页 / 共12页
设备管理块设备分析.docx_第4页
第4页 / 共12页
设备管理块设备分析.docx_第5页
第5页 / 共12页
设备管理块设备分析.docx_第6页
第6页 / 共12页
设备管理块设备分析.docx_第7页
第7页 / 共12页
设备管理块设备分析.docx_第8页
第8页 / 共12页
设备管理块设备分析.docx_第9页
第9页 / 共12页
设备管理块设备分析.docx_第10页
第10页 / 共12页
设备管理块设备分析.docx_第11页
第11页 / 共12页
设备管理块设备分析.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

设备管理块设备分析.docx

《设备管理块设备分析.docx》由会员分享,可在线阅读,更多相关《设备管理块设备分析.docx(12页珍藏版)》请在冰点文库上搜索。

设备管理块设备分析.docx

设备管理块设备分析

块设备驱动程序

Linux0.11内核包含3个块设备的驱动:

ramdisk,硬盘,软盘。

首先需要注意的块设备的操作方式:

在系统(内核)与硬盘进行IO操作时,需要考虑三个对象之间的交互作用。

它们是系统、控制器和驱动器(例如硬盘或软盘驱动器)。

系统可以直接向控制器发送命令或等待控制器发出中断请求:

控制器在接受到命令后就会控制驱动器的操作,读/写数据或者进行其他操作。

因此我们可以把这里控制器发出的中断信号看作是这三者之间的同步操作信号,所经历的操作步骤为:

首先系统指明控制器在执行命令结束而引发的中断过程中应该调用的C函数,然后向块设备控制器发送读、写、复位或其他操作命令。

当控制器完成了指定的命令,会发出中断请求信号,引发系统执行块设备的中断处理过程,并在其中调用指定的C函数对读/写或其他命令进行命令结束后的处理工作。

块设备表项和请求项数组构成的数据结构是块设备部分的核心数据结构。

请求队列数组与块设备结构为如下关系

请求项数组存放所有系统中对块设备的请求,原因估计是块设备一般都是低速外设,所以处理时间较长,来不及的请求先存储起来。

每个块设备表项的current_request指向当前需要处理的请求项数组中的请求项,在请求项数组中的请求项之间用指针相链接,这样就构成了对某一设备的请求队列。

下面分析ll_rw_blk.c程序,它是块设备(软硬盘,ramdisk)与缓冲管理之间的接口程序,主要功能是为块设备创建块设备读写请求项,并插入到指定块设备请求队列中。

实际的读写操作由请求项处理函数request_fn完成。

request_fn通过blk.h的宏定义映射到实际设备的操作(do_hd_request,do_fd_request,do_rd_request)

ll_rw_block调用序列

如上图,ll_rw_block程序为左半边图,作用是往请求项链表中插入请求项,插完后调用request_fn()会引发中断逐个处理某设备的所有请求项。

插入请求项是利用电梯算法插入到对应某个设备的请求链表中。

对于硬盘,首先涉及的是硬盘的知识,0.11内核支持的是AT硬盘。

硬盘的分区结构如下:

与代码联系较紧密的是主引导记录的分区表,内核中partition结构完全对应了分区表的字段。

硬盘参数及类型(Linux0.11只支持最多两个硬盘)

hd_info

0

1

hd_i_struct

{

磁头数

每磁道扇区数

柱面数

写前预补偿柱面号

磁头着陆柱面号

控制字节

}

硬盘分区结构(0,5代表第1,第2个硬盘,1~4,6~9为两硬盘的分区)

0

1

2

3

4

5

6

7

8

9

hd_struct

{

物理起始扇区号

分区扇区数

}

sys_setup函数在系统初始化时被调用,以下为其步骤:

硬盘操作的核心函数是do_hd_request函数,hd.c中其余函数均为其服务。

以下为do_hd_request流程

检查请求合法性

换算硬盘的扇区号、柱面号和磁道号

若要执行复位硬盘,则复位硬盘

若重新校正标志置位,则重新校正硬盘

若当前请求是写扇区命令,循环读取状态寄存器看是否就绪

若规定时间(次数)内读取成功,发送1个扇区数据到数据寄存器,否则写盘失败,去处理下一个硬盘请求

若当前请求是读扇区命令,发送读扇区命令

详见p137解释和p138图6-3

下面分析硬盘驱动程序linux/kernel/blk_drv/hd.c

该文件内容分两部分1.硬盘初始化2.硬盘驱动

以下关注硬盘驱动的实现。

其主流程是do_hd_request,由于该流程也在中断中被调用,所以该函数被反复调用,用来处理硬盘复位、重校、读、写的请求。

下面分三部分对该函数拆解:

1.复位、重校统称为错误处理(因为复位流程保含了重校流程)2.写盘3.读盘

错误流程处理:

对于结束对该请求项的处理见blk.hp136end_request函数,执行流程为:

关闭设备

置当前处理中的请求设备对应缓冲区更新标志

若更新标志为0,显示出错信息

唤醒等待该请求项的进程,唤醒等待请求的进程

释放该请求项,指向下一请求项

错误处理流程属于辅助流程,每次处理读、写请求都可能会经历,是保证操作成功的必要步骤。

中断过程是由硬盘控制器触发的中断引起的,中断会传入8259中断控制器再传给CPU,操作系统会调用do_hd指向的函数作为中断过程执行。

因此程序中把do_hd赋值给某函数指针,等到硬盘控制器中断被CPU接收后,中断过程就“自动”执行。

至于如何“自动”,即中断实现原理,将在进程调度与系统调用一章讨论。

读写硬盘的流程大致如下:

写盘流程处理

读盘流程处理

可以看出,写盘、读盘流程差别不大,区别就在于写盘要先读状态寄存器信息并进行第一次写盘。

下面分析软盘驱动程序linux/kernel/blk_drv/floppy.c,其主流程同样是do_fd_request,与硬盘驱动最大的不同是用到了一些定时操作,详见p157描述,do_fd_request同样分为1.复位、重校统称错误处理2.写盘3.读盘三部分

错误处理流程

读盘、写盘操作仅有细微差别,并在一起分析:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2