ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:300.21KB ,
资源ID:4386546      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4386546.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(块设备分析.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

块设备分析.docx

1、块设备分析块设备驱动程序LinuxO. 11内核包含3个块设备的驱动:ramdisk,硬盘,软盘。首先需要注意的块设备的操作方式:在系统(内核)与硬盘进行 10操作时,需要考虑三个对象之间的交互作用。它们是系统、控制器和驱动器(例如硬盘或软盘驱 动 器)。系统可以直接向控制器发送命令或等待控制器发出中断请求:控制器在接受到命令后 就会控制驱动器的操作,读/写数据或者进行其他操作。因此我们可以把这 里控制器发出的 中断信号看作是这三者之间的同步操作信号,所经历的操作步骤为:首先系统指明控制器在执行命令结束而引发的中断过程中应该调用的C函数,然后向 块设备控制器发送读、写、复位或其他操作命令。当控

2、制器完成了指定的命令,会发出中断 请求信号,引发系统执行块设备的中断处理过程,并在其中调用指定的c函数对读/写或其 他命令进行命令结束后的处理工作。块设备表项和请求项数组构成的数据结构是块设备部分的核心数据结构请求队列数组与块设 备结构为如下关系请求项数组存放所有系统中对块设备的请求,原因估计是块设备一般都是低速外设,所以处 理时间较长,来不及的请求先存储起来。每个块设备表项的curre nt_reques指向当前需要处理的请求项数组中的请求项,在请求项数组中的请 求项之 间用指针相链接,这样就构成了对某一设备的请求队列。下面分析ll_rw_blk. c程序,它是块设备(软硬盘,ramdisk

3、)与缓冲管理之间的接口程序, 主要功能是为块设备创建块设备读写请求项,并插入到指定块设备请求队列中。实际的读写 操作由请求项处理函数 request_fn完成。request_fn通过blkh的宏定义映射到实际设备的操作(do_hd_request do_fd_request do_rd_reques)lrwbl oc k ()*niakereque*t !)11 rw block调用序列如上图,ll_w_block程序为左半边图,作用是往请求项链表中插入请求项,插完后调用 request_fn (会引发中断逐个处理某设备的所有请求项。插入请求项是利用 电梯算法插入到 对应某个设备的请求链表中

4、。对于硬盘,首先涉及的是硬盘的知识,0. 11内核支持的是AT硬盘。硬盘的分区结构如下: :分淫引导记录! 区! !表!基本分区1基本分区2枝;盘!基本分区3辑駆动器Ii、i扩嚴引i逻i导记采 图 5 Y-4!器!主引第1分区表顶第2分区表项第3分区表项第4分区表项 10x55 AA引导扁区 引导扁区 引导扁区k0x55AA引导扇区0x55AA引导定区分区的基本磯i扌广i扩好区袁顶1X XBBBBfjrtj展険徐区惡硕2甩逼分区表顶3记捶一空区養理L厂j扩軀刖导记录j扩汾区袁顶1獎符区袁硕2 j F -1陆區翹 1 br就-( 衷电J -眉一&紀脸 扩槪分区爲一左12 一 :志一 一硕一顶 一

5、衷衷衷 一&懐K上址A.一、丫前1 卞V耒用9x55 AA 引导扁区当前1下L桶L桶.1 * Bx5?AA引导底区当前下f枫10x55 AA引导扁区1图百仆恼表链接图小与代码联系较紧密的是主引导记录的分区表,内核中 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床

6、韭1BFStart head 秆1ICOStart sector 秆疑 USE1ICOStart cylinder 妍 tttl 芒01C20px tni ixidiutur Qi071C3End head 炖#04:2541C4End sector 诊。京电631C4End cylinder8911C6Sectors preceding partition 163床分电之荀钓扁1CALength of partition 1 in sector14329917床分电的貳E塔託PartitionTable Entry #2ICE80 = active partition001CFStart h

7、ead0IDOStrt sector1IDOStart cylinder8921D2Operating systfn indicator (hex0F1D3End head2541D4End sector631D4End cylinder10231D6Sectors preceding partition 214329980IDALength of partition 2 in sector220106565PartitionTable Entry #3IDE J80 = active partition00IDF mStart head0IEO 2MStart sector0IEO 2WSt

8、art cylinder01E2 QHOperating system indicator (hex001E3 百 MEnd head01E4 6MEnd sector01E4 6MEnd cylinder01E6Sectors preceding partition 301EA CMLength of partition 3 in sector0PartitionTable Entry #41EE80 = getive partition001EFStart head01F0Start sector01F0Strt cylinder01F2Operating system indicator

9、 Qtex001F3End h “d01F4End sector01F4End cylinder01F6Sectors preceding partition 40硬盘参数及类型(LinuxO.l 1只支持最多两个硬盘) hd infohd i struct磁头数每磁道扇区数柱面数写前预补偿柱面号磁头着陆柱面号控制字节物理起始扇区号分区扇区数sys.setup函数在系统初始化时被调用,以下为其步骤:硬盘操作的核心函数是do_hd_request函数,hdc中其余函数均为其服务。以下为 do_hd_reques 流程详见P137解释和pl38图6-3卜面分析硬盘驱动程序linu x/kernel

10、/blk_drv/hd. c该文件内容分两部分1.硬盘初始化2.硬盘驱动以下关注硬盘驱动的实现。其主流程是 do_hd_request由于该流程也在中断中被调用,所以该函数被反复调用,用来处理硬盘复位、重校、读、写的请求。下面分 三部分 对该函数拆解:1 复位、重校统称为错误处理(因为复位流程保含了重校流程)盘 2 写盘3 读I 复位硬盘控制器硬盘控制器错误流程处理:CPU监测硬盘执行命令后 的状态,1 若出错看 是否超出最多允许出 错数,则结束对该请 求项的处理,若出错 数人于故多允许错误 数一半,则岂reset=12.不岀错则继续处理 硬盘请求 do_hd_request对于结束对该请求项

11、的处理见blk. h pl36 en d_reques函数,执行流程为:错误处理流程属于辅助流程,每次处理读、写请求都可能会经历,是保证操作成功的 必要步骤。中断过程是由硬盘控制器触发的中断引起的,中断会传入 8259中断控制器再传给CPU,操作系统会调用do_hd指向的函数作为中断过程执行。因此程序中把do_hd赋值 给某函数指针,等到硬盘控制器中断被 CPU接收后,中断过程就“自动”执行。至于如何“自动”,即中断实现原理,将在进程调度与系统调用一章讨 论。 读写硬盘的流程大致如下:执仃程序 独盘拧制卷读盘操fl执彳J程时rH写盘流程处理处理请求歳屮诵处FI!过耗别藩处理一*写命令 读状态二

12、传口婕据件读数据1.发送写命令及扇区等 命令,中断指令do_hd 同时指向写扇区中断函 数2.循环读取状态寄存器 信息并判断请求服务标 志DRQ_STAT是否置 位3.若循环结束仍未置 位,执行错误处理流 程。否则进行硬盘第一 次写数据中断硬盘控制器执行写一个扇 区数据中断过程硬盘控制器执行写一个扇 区 数据1.若硬盘控制器返回错 误信息,执行错误处理 流程并返回2.否则置中断函数指针 do_hd为9硬盘函数, 并向数据寄存器端口写 256字即512B,个扇 区3.若全部扇区数据已写读盘流程处理完,处理请求结束事 宜,执行下一硬盘请求中析过程可以看出,写盘、读盘流程差别不大,区别就在于写盘要先

13、读状态寄存器信息并进行 第一次写盘。卜而分析软盘驱动程序linux/keinel/blk_div/floppy, c,英主流程同样是 do_fd_request与硬盘驱动最大的不同是用到了一些定时操作,详见 pl57描述,do fd request同样分为1.复位、重校统称错误处理2.写盘3.读盘三部分错误处理流程CPU硕盘控制器屮断过程1 关中断2.置贯賈软盘操作后的 中断调用函数,即do_floppy 指向reset_interrupt3.延忑等待后启动软盘 控制器4.开中断1.检测中断状态,读取 命令执行结果字节2.发送设定软驱参数命 令中断启动软盘t控制器设定软盘控制器参数读盘、写盘操

14、作仅有细微差别,并在一起分析:读写命令码2.添加定时器,指定驱 动器到能正常运行需要 的时间(秒),X定时do_fd requ到时调用函数floppy_on_interrupt定时中断1.置已选择当前驱动器 标忐2.设置数字输出寄存器 DOR为当前驱动器3.执行读写传输函数 transferof 1 oppy_OR_iat-errupt中断过程seek1.检测中断状态命令,若 出错执行错误处理流程 否则设置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