1、: :分淫引导记录! 区! !表!基本分区1基本分区2枝;盘!基本分区3辑駆动器Ii、i扩嚴引i逻i导记采 图 5 Y-4器!主引第1分区表顶第2分区表项第3分区表项第4分区表项 10x55 AA引导扁区 引导扁区 引导扁区k0x55AA引导扇区引导定区分区的基本磯i扌广i扩好区袁顶1X XBBBBfjrtj展険徐区惡硕2甩逼分区表顶3记捶一空区養理L厂j扩軀刖导记录j扩汾区袁顶1獎符区袁硕2 j F -1陆區翹 1 br就-( 衷电J -眉一&紀脸 扩槪分区爲一左12 一 :志一 一硕一顶 一衷衷衷 一&懐K上址A.一、丫前1 卞V耒用9x55 AA 当前1下L桶.1 * Bx5?AA引导底
2、区下f枫11图百仆恼表链接图小与代码联系较紧密的是主引导记录的分区表,内核中 partition结构元全对应了 分区表的字段。riaster Boot Record# 基 fit 假移星-Offset标题数值0 1611Master bootstrap loader code33 CO 8E DO BC 00 7C FBPartitionTable Entry #11BE80 = active partition 席总粉 Efi 衣80 fit尽矣珈 ax床韭1BFStart head 秆1ICOStart sector 秆疑 USEStart cylinder 妍 tttl 芒1C20px
3、tni ixidiutur Qi071C3End head 炖#04:2541C4End sector 诊。京电63End cylinder8911C6Sectors preceding partition 163床分电之荀钓扁1CALength of partition 1 in sector14329917床分电的貳E塔託Table Entry #2ICE80 = active partition001CFStart headIDOStrt sectorStart cylinder8921D2Operating systfn indicator (hex0F1D3End head1D4En
4、d sector10231D6Sectors preceding partition 214329980IDALength of partition 2 in sector220106565Table Entry #3IDE JIDF mIEO 2MStart sectorIEO 2W1E2 QHOperating system indicator (hex1E3 百 M1E4 6M1E6Sectors preceding partition 31EA CMLength of partition 3 in sectorTable Entry #41EE80 = getive partition
5、1EF1F0Strt cylinder1F2Operating system indicator Qtex1F3End h “d1F41F6Sectors preceding partition 4硬盘参数及类型(LinuxO.l 1只支持最多两个硬盘) hd infohd i struct磁头数每磁道扇区数柱面数写前预补偿柱面号磁头着陆柱面号控制字节物理起始扇区号分区扇区数sys.setup函数在系统初始化时被调用,以下为其步骤:硬盘操作的核心函数是do_hd_request函数,hdc中其余函数均为其服务。以下为 do_hd_reques 流程详见P137解释和pl38图6-3卜面分析硬盘
6、驱动程序linu x/kernel/blk_drv/hd. c该文件内容分两部分1.硬盘初始化2.硬盘驱动以下关注硬盘驱动的实现。其主流程是 do_hd_request由于该流程也在中断中被调用,所以该函数被反复调用,用来处理硬盘复位、重校、读、写的请求。下面分 三部分 对该函数拆解:1 复位、重校统称为错误处理(因为复位流程保含了重校流程)盘 2 写盘3 读I 复位硬盘控制器硬盘控制器错误流程处理:CPU监测硬盘执行命令后 的状态,1 若出错看 是否超出最多允许出 错数,则结束对该请 求项的处理,若出错 数人于故多允许错误 数一半,则岂reset=12.不岀错则继续处理 硬盘请求 do_hd
7、_request对于结束对该请求项的处理见blk. h pl36 en d_reques函数,执行流程为:错误处理流程属于辅助流程,每次处理读、写请求都可能会经历,是保证操作成功的 必要步骤。中断过程是由硬盘控制器触发的中断引起的,中断会传入 8259中断控制器再传给CPU,操作系统会调用do_hd指向的函数作为中断过程执行。因此程序中把do_hd赋值 给某函数指针,等到硬盘控制器中断被 CPU接收后,中断过程就“自动”执行。至于如何“自动”,即中断实现原理,将在进程调度与系统调用一章讨 论。 读写硬盘的流程大致如下:执仃程序 独盘拧制卷读盘操fl执彳J程时rH写盘流程处理处理请求歳屮诵处FI
8、!过耗别藩处理一*写命令 读状态二传口婕据件读数据1.发送写命令及扇区等 命令,中断指令do_hd 同时指向写扇区中断函 数2.循环读取状态寄存器 信息并判断请求服务标 志DRQ_STAT是否置 位3.若循环结束仍未置 位,执行错误处理流 程。否则进行硬盘第一 次写数据中断硬盘控制器执行写一个扇 区数据中断过程硬盘控制器执行写一个扇 区 数据1.若硬盘控制器返回错 误信息,执行错误处理 流程并返回2.否则置中断函数指针 do_hd为9硬盘函数, 并向数据寄存器端口写 256字即512B,个扇 区3.若全部扇区数据已写读盘流程处理完,处理请求结束事 宜,执行下一硬盘请求中析过程可以看出,写盘、读
9、盘流程差别不大,区别就在于写盘要先读状态寄存器信息并进行 第一次写盘。卜而分析软盘驱动程序linux/keinel/blk_div/floppy, c,英主流程同样是 do_fd_request与硬盘驱动最大的不同是用到了一些定时操作,详见 pl57描述,do fd request同样分为1.复位、重校统称错误处理2.写盘3.读盘三部分错误处理流程硕盘控制器屮断程1 关中断2.置贯賈软盘操作后的 中断调用函数,即do_floppy 指向reset_interrupt3.延忑等待后启动软盘 控制器4.开中断1.检测中断状态,读取 命令执行结果字节2.发送设定软驱参数命 令启动软盘t控制器设定软盘
10、控制器参数读盘、写盘操作仅有细微差别,并在一起分析:读写命令码2.添加定时器,指定驱 动器到能正常运行需要 的时间(秒),X定时do_fd requ到时调用函数floppy_on_interrupt定时中断1.置已选择当前驱动器 标忐2.设置数字输出寄存器 DOR为当前驱动器3.执行读写传输函数 transferof 1 oppy_OR_iat-erruptseek1.检测中断状态命令,若 出错执行错误处理流程 否则设置X前磁道为寻 道号腥1执U行tsetup_rw_floppy1.初始花软盘DMA通 道2.置软盘中断指针 do_floppy 为 rw_interrupt3.发送读写命令及扇 区_r等参数ppysetuip根据读写命令在软盘与内存缓冲区之间传数据1.若软盘写保护,结束 请求项2.若为其他错误,执行 错误处理流程3.因DMA的寻址为1MB空间,对读操作作 rw 10:cr处理4.释放软盘,结束请求
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1