Board logo

标题: usb-hdd模式的u盘被识别为软盘初探 [打印本页]

作者: yaya     时间: 2008-9-11 10:05    标题: usb-hdd模式的u盘被识别为软盘初探

u盘格式化为usb-hdd,启动时主板一般识别为硬盘,分配盘符c。但是有的主板会识别为软盘,分配盘符a。这两种情况都能正常启动。

我们知道,硬盘的0-0-1(或逻辑扇区0)是主引导记录MBR,内含分区表。间隔3f扇区(隐含扇区数)即0-1-1(或逻辑扇区3f)是启动扇区DBR,内含BPB参数。启动硬盘时,首先加载主引导记录,然后由主引导记录再加载启动扇区。启动程序查找引导文件(io.sys、ntldr或grldr等)时,要计算文件分配表、目录区、数据区扇区的起始位置(CHS或LBA),此时要用到隐含扇区数(3F)这个参数。执行读操作int13/02(或42)时,把磁盘的物理驱动器号80赋给dl。

而软盘的0-0-1(或逻辑扇区0)是启动扇区DBR,内含BPB参数。启动软盘时,直接加载启动扇区。启动程序查找引导文件(io.sys、ntldr或grldr等)时,也要计算文件分配表、目录区、数据区扇区的起始位置(CHS或LBA),此时要用到隐含扇区数(00)这个参数。执行读操作int13/02(或42)时,把磁盘的物理驱动器号00赋给dl。

这就产生了疑问。u盘格式化为usb-hdd,其BPB参数的磁盘物理驱动器号是80(偏移7C24处),隐含扇区数是00 00 00 3F(偏移7C1C处),此时按硬盘正常启动可以理解。而按软盘启动,本应该赋给dl的00成了80,隐含扇区数00成了3F,怎么会正确地找到引导文件?

为了探明这个奥秘,编了一段测试代码,经探测后发现:
    1.启动后首先加载启动扇区到7C00,为0-0-1(或逻辑扇区0),看不到主引导记录。
    2.修改7C24处为00(磁盘物理驱动器号),修改7C1C处为00 00 00 00(隐含扇区数)。(修改内存,不是u盘!)
    3.然后从7C00处开始执行启动代码。
原来是主板修改了BPB参数,所以能正确地找到引导文件,成功启动。

另外探测到:BIOS加载0-0-1(对于硬盘是主引导记录,对于软盘是启动扇区)时,dl代入的参数是磁盘物理驱动器号,u盘被识别为硬盘时DX=0080,被识别为软盘时DX=0000。
                  BIOS加载0-1-1(u盘被识别为硬盘时)时,DX=0180。

u盘格式化为usb-hdd被主板识别为软盘,好处是不占用盘符c,对安装操作系统有好处。提醒:如果u盘分为2个分区,另一个分区会分配盘符c!

u盘格式化为usb-hdd被主板识别为软盘,此时用bootlace.com安装grub4dos,不能在识别为硬盘时正常启动,需修改启动扇区:
    1.用WinHex打开磁盘;
    2.将7E1C处00改为3F,将7E24处00改为80,将7E54处89改为8B。
    3.修改grldr,把文件末尾菜单中的‘--ignore-floppies ’全删除。
或者在被主板识别为硬盘的电脑上用bootlace.com安装grub4dos.

[ Last edited by yaya on 2008-9-12 at 04:10 PM ]
作者: fujianabc     时间: 2008-9-12 10:23
分析的不错,有深度。
作者: 不点     时间: 2008-9-12 10:53
yaya,你做得很棒。如果你能够加入 grub4dos 的开发,估计很多人都高兴。
作者: yaya     时间: 2008-9-12 16:33
不点过奖了。对于dos的了解我还很肤浅,对于grub4dos只是初步涉及,自认为不够做1名grub4dos开发者。不过如果能为grub4dos的开发做1点力所能及的事,本人乐于奉献。
作者: 不点     时间: 2008-9-12 18:49
yaya,你对汇编语言很熟悉,对引导扇区和引导过程也都比较了解。因此我觉得你参加 grub4dos 的开发是最合适的。即使你不参加grub4dos,你也该加入其它某个启动软件的开发。不如你就加入 grub4dos 吧,或者你再观察了解一个时期以后再做决定。grub4dos 需要你这样的人。你可以先以非正式的身份加入,做些准备工作,提交一些补丁之类的。在你以后确信自己有时间或者有意愿的情况下,再正式加入。开发 grub4dos,没有任何压力,我就是这种感觉。所以,我们的主要精力就完全集中于:如何把 grub4dos 设计得更好?

忘了说了,yaya,你的名字很好,很大气的,我很欣赏这个名字。当初我这个名字起得有些随意了,现在不满意。

[ Last edited by 不点 on 2008-9-13 at 11:47 AM ]