块设备分析Word文件下载.docx
《块设备分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《块设备分析Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
:
:
分
淫引导记录!
区!
!
表
!
基本分区1
•基本分区2
枝;
盘!
基本分区3
辑駆动器
I
i、i扩
嚴引
i逻i导
记采图5Y-4
器!
主引
第1分区表顶
第2分区表项
第3分区表项
第4分区表项1
0x55AA
引导扁区•
引导扁区・
引导扁区
k
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桶
.1*Bx5?
AA
引导底区
下f
枫1
1±
图百仆恼表链接图小
与代码联系较紧密的是主引导记录的分区表,内核中partition结构元全对应了分区表的字段。
"
r'
iasterBootRecord#基fit假移星-
Offset
标题
数值
01611
Masterbootstraploadercode
33CO8EDOBC007CFB
Partition
TableEntry#1
1BE
80=activepartition席总粉Efi衣
80fit尽矣珈•ax床韭
1BF
Starthead秆
1
ICO
Startsector秆疑USE
Startcylinder妍tttl芒
1C2
0p«
xt«
niixidi^uturQi・
07
1C3
Endhead炖#04:
254
1C4
Endsector诊。
京电
63
Endcylinder
891
1C6
Sectorsprecedingpartition1
63床分电之荀钓扁
1CA
Lengthofpartition1insector
14329917床分电的貳E塔託
TableEntry#2
ICE
80=activepartition
00
1CF
Starthead
IDO
St<
rtsector
Startcylinder
892
1D2
Operatingsyst^fnindicator(hex
0F
1D3
Endhead
1D4
Endsector
1023
1D6
Sectorsprecedingpartition2
14329980
IDA
Lengthofpartition2insector
220106565
TableEntry#3
IDEJ〃
IDFm
IEO2M
Startsector
IEO2W
1E2QH
Operatingsystemindicator(hex
1E3百M
1E46M
1E6
Sectorsprecedingpartition3
1EACM
Lengthofpartition3insector
TableEntry#4
1EE
80=getivepartition
1EF
1F0
St〈rtcylinder
1F2
OperatingsystemindicatorQtex
1F3
Endh“d
1F4
1F6
Sectorsprecedingpartition4
硬盘参数及类型(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.读盘三部分
错误处理流程
硕盘控制器
屮
断
程
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.释放软盘,结束请求