块设备分析.docx

上传人:b****3 文档编号:4386546 上传时间:2022-12-01 格式:DOCX 页数:14 大小:300.21KB
下载 相关 举报
块设备分析.docx_第1页
第1页 / 共14页
块设备分析.docx_第2页
第2页 / 共14页
块设备分析.docx_第3页
第3页 / 共14页
块设备分析.docx_第4页
第4页 / 共14页
块设备分析.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

块设备分析.docx

《块设备分析.docx》由会员分享,可在线阅读,更多相关《块设备分析.docx(14页珍藏版)》请在冰豆网上搜索。

块设备分析.docx

块设备分析

块设备驱动程序

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

ramdisk,硬盘,软盘。

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

在系统(内核)与硬盘进行10操作时,需要

考虑三个对象之间的交互作用。

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

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

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

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

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

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

块设备表项和请求项数组构成的数据结构是块设备部分的核心数据结构请求队列数组与块设备结构为如下关系

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

每个块设备表项的

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

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

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

request_fn通过blk・h的

宏定义映射到实际设备的操作(do_hd_requestdo_fd_requestdo_rd_reques)

lrw^block()

*

niake^reque*t!

11rwblock调用序列

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

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

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

硬盘的分区结构如

下:

:

:

淫引导记录!

区!

!

基本分区1

•基本分区2

枝;

盘!

!

基本分区3

辑駆动器

I

i、i扩

嚴引

i逻i导

记采图5Y-4

!

器!

主引

第1分区表顶

第2分区表项

第3分区表项

第4分区表项1

0x55AA

引导扁区•

引导扁区・

引导扁区

k

0x55AA

引导扇区

0x55AA

引导定区

分区的基本磯

 

i扌广i扩好区袁顶1

XXBBBBfjr・・t・・■■

j展険徐区惡硕2甩逼分

区表顶3

■记捶一空区養理L

厂j・

扩軀刖导记录j

扩汾区袁顶1獎

符区袁硕2

•・■■■■『j■■F

■■■■-

1陆區翹

•1br就

--(衷电

J-眉一

&」

紀脸

•・扩槪分区爲一左

•1

2一:

志一一硕一顶一衷衷衷一&〈•懐

K上

■址

•A.一

、丫前

1卞V

耒用

[9x55AA]

引导扁区

当前

1下〃

L桶

L桶

.1*Bx5?

AA

引导底区

当前

下f

枫1

0x55AA

引导扁区

图百仆恼表链接图小

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

 

"r'iasterBootRecord#基fit假移星-

Offset

标题

数值

01611

Masterbootstraploadercode

33CO8EDOBC007CFB

Partition

TableEntry#1

1BE

80=activepartition席总粉Efi衣

80fit尽矣珈•ax床韭

1BF

Starthead秆

1

ICO

Startsector秆疑USE

1

ICO

Startcylinder妍tttl芒

0

1C2

0p«xt«niixidi^uturQi・

07

1C3

Endhead炖#04:

254

1C4

Endsector诊。

京电

63

1C4

Endcylinder

891

1C6

Sectorsprecedingpartition1

63床分电之荀钓扁

1CA

Lengthofpartition1insector

14329917床分电的貳E塔託

Partition

TableEntry#2

ICE

80=activepartition

00

1CF

Starthead

0

IDO

St

1

IDO

Startcylinder

892

1D2

Operatingsyst^fnindicator(hex

0F

1D3

Endhead

254

1D4

Endsector

63

1D4

Endcylinder

1023

1D6

Sectorsprecedingpartition2

14329980

IDA

Lengthofpartition2insector

220106565

Partition

TableEntry#3

IDEJ〃

80=activepartition

00

IDFm

Starthead

0

IEO2M

Startsector

0

IEO2W

Startcylinder

0

1E2QH

Operatingsystemindicator(hex

00

1E3百M

Endhead

0

1E46M

Endsector

0

1E46M

Endcylinder

0

1E6

Sectorsprecedingpartition3

0

1EACM

Lengthofpartition3insector

0

Partition

TableEntry#4

1EE

80=getivepartition

00

1EF

Starthead

0

1F0

Startsector

0

1F0

St〈rtcylinder

0

1F2

OperatingsystemindicatorQtex

00

1F3

Endh“d

0

1F4

Endsector

0

1F4

Endcylinder

0

1F6

Sectorsprecedingpartition4

0

硬盘参数及类型(LinuxO.l1只支持最多两个硬盘)hdinfo

hdistruct

{

磁头数

每磁道扇区数

柱面数

写前预补偿柱面号

磁头着陆柱面号控制字节

物理起始扇区号分区扇区数

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

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

以下为do_hd_reques流程

详见P137解释和pl38图6-3

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

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

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

其主流程是do_hd_request由于该流程也在中断中被

调用,所以该函数被反复调用,用来处理硬盘复位、重校、读、写的请求。

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

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

I复位硬盘控制器

硬盘控制器

错误流程处理:

CPU

监测硬盘执行命令后的状态,1•若出错看是否超出最多允许出错数,则结束对该请求项的处理,若出错数人于故多允许错误数一半,则岂reset=1

2.不岀错则继续处理硬盘请求do_hd_request

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

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

中断过程是由硬盘控制器触发的中断引起的,中断会传入8259中断控制器再

传给CPU,操作系统会调用do_hd指向的函数作为中断过程执行。

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

动”执行。

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

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

执仃程序独盘拧制卷

读盘操fl

执彳J程

r

H]

写盘流程处理

处理请求歳

屮诵处FI!

耗别藩处理

一*写命令<读状

态二传口婕据件读

数据

 

1.发送写命令及扇区等命令,中断指令do_hd同时指向写扇区中断函数

2.循环读取状态寄存器信息并判断请求服务标志DRQ_STAT是否置位

3.若循环结束仍未置位,执行错误处理流程。

否则进行硬盘第一次写数据

中断

硬盘控制器执行写一个扇区数据

 

中断过程

硬盘控制器执行写一个扇区数据

1.若硬盘控制器返回错误信息,执行错误处理流程并返回

2.否则置中断函数指针do_hd为9硬盘函数,并向数据寄存器端口写256字即512B,—个扇区

3.若全部扇区数据已写

读盘流程处理

完,处理请求结束事宜,执行下一硬盘请求

 

中析过程

 

 

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

卜而分析软盘驱动程序linux/kei'nel/blk_di'v/floppy,c,英主流程同样是do_fd_request与硬盘驱动最大的不同是用到了一些定时操作,详见pl57描述,

dofdrequest同样分为1.复位、重校统称错误处理2.写盘3.读盘三部分

错误处理流程

CPU

硕盘控制器

1•关中断

2.置贯賈软盘操作后的中断调用函数,即

do_floppy指向

reset_interrupt

3.延忑等待后启动软盘控制器

4.开中断

1.检测中断状态,读取命令执行结果字节

2.发送设定软驱参数命令

中断

启动软盘

t控制器

设定软盘控制器参数

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

 

读写命令码

2.添加定时器,指定驱动器到能正常运行需要的时间(秒),X定时

do_fdrequ到时调用函数

floppy_on_interrupt

定时中断

1.置已选择当前驱动器标忐

2.设置数字输出寄存器DOR为当前驱动器

3.执行读写传输函数transfero

f1oppy_OR_iat-errupt

中断过程

seek

1.检测中断状态命令,若出错执行错误处理流程否则设置X前磁道为寻道号

腥1■执U行

tsetup_rw_floppy

1.初始花软盘DMA通道

2.置软盘中断指针do_floppy为rw_interrupt

3.发送读写命令及扇区_r等参数ppy

setuip

中断

根据读写命令在软盘与内

存缓冲区之间传数据

 

中断过程

1.若软盘写保护,结束请求项

2.若为其他错误,执行错误处理流程

3.因DMA的寻址为

・1MB空间,对读操作作rw10

cr处理'

4.释放软盘,结束请求

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

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1