无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: Pauly
打印 上一主题 下一主题

反馈一个 grldr.mbr 0.4.6a 的 bug

  [复制链接]
181#
 楼主| 发表于 2013-11-13 15:34:05 | 只看该作者
2011yaya2007777 发表于 2013-11-13 15:31
问题是否因为从 FDD 模式启动,BIOS 却分配了驱动器号 0x80,grldr 认为它是异端,从而重新设置驱动器号 00 ...

我没有研究过 G4D 的代码,是否因为在某处发现这是 FDD 格式,而误将磁盘号设为 0 了?
回复

使用道具 举报

182#
发表于 2013-11-13 16:04:11 | 只看该作者
本帖最后由 mygamexxx 于 2013-11-13 16:16 编辑

p大的BOOTICE 是好软件,玩启动是离不开了!!

用1.31版的BOOTICE重写分区引导记录,0.4.5c,find顺利运行,并能找到hd0上的文件。启动hd0上的XPPE也不再卡在NATIVE界面了,但启动后U盘还是不可见。
回复

使用道具 举报

183#
 楼主| 发表于 2013-11-13 16:19:38 | 只看该作者
2011yaya2007777 发表于 2013-11-13 15:31
问题是否因为从 FDD 模式启动,BIOS 却分配了驱动器号 0x80,grldr 认为它是异端,从而重新设置驱动器号 00 ...

另外一个问题,测试时发现 0.46a grldr.mbr 在 EXFAT 分区搜索文件时,文件名必须是 5 个字符。grldr.pbr 在 EXFAT 分区搜索文件时,文件名必须是 grldr,否则搜索不到。
今天看了 0.46a grldrstart.s 中 EXFAT 部分的代码,发现 GRLDR 文件名长度被硬编码为 5 个。

能否作一改进,将文件名长度放宽到 8.3 格式?或者 8 个字符?这样我在 BOOTICE 中就可以统一处理了。
回复

使用道具 举报

184#
发表于 2013-11-13 16:23:27 | 只看该作者
本帖最后由 2011yaya2007777 于 2013-11-13 19:06 编辑

关于通过 BIOS 读扇区的探索

环境:
a  联想笔记本,SD卡(驱动器号 00),硬盘(驱动器号 0x80)
b  明基笔记本,三星手机+内存卡(驱动器号 00),手机+外置卡(驱动器号 0x80)

1  通过 int13/AH=02(即CHS模式)读 0-0-1,1扇区
  a  00:成功
    0x80:成功
  b  00:失败,没有错误提示
    0x80:成功
2  通过 int13/AH=0x42(即LBA模式)读逻辑0扇区, 1扇区
  a  00:失败,没有错误提示;进入 grldr 后,卡在探测 pxe ,好长时间进入菜单,又卡在查找 fd0 菜单
    0x80(硬盘):失败,有错误提示;复位后再读,成功;或者失败后使用 CHS 模式读,成功
  b  00:失败,没有错误提示;或者预先复位再读,失败
    0x80:失败,没有错误提示;或者预先复位再读,失败

结论:
三星手机+内存卡,即使强制使用 LBA 模式读扇区,也不一定成功。
不通过 int13/AH=0x41 探测,冒然使用 LBA 读扇区,有一定风险。
回复

使用道具 举报

185#
发表于 2013-11-13 16:30:35 | 只看该作者
能否作一改进,将文件名长度放宽到 8.3 格式?或者 8 个字符?这样我在 BOOTICE 中就可以统一处理了。

可以是 8.3 格式,或者说是 11 个字符。需修改引导代码。以后提交。
回复

使用道具 举报

186#
发表于 2013-11-13 16:56:13 | 只看该作者
HDD 格式的存储卡插入三星手机,再连接电脑,此时看到的存储卡都是 FDD 模式,其余扇区被屏蔽了。

这有点特殊。使用 CHS 模式读 0-0-1,返回的是 PBR,且拒绝 LBA 读;但是加载 usb 驱动后,可以使用 LBA 读,逻辑0扇区是 PBR,仍然相同。PBR 之前彻底屏蔽了。

我的电脑启动某个U盘时,使用 CHS 模式读 0-0-1,返回的是 PBR,且拒绝 LBA 读;但是加载 usb 驱动后,可以使用 LBA 读,逻辑0扇区是 MBR。
回复

使用道具 举报

187#
发表于 2013-11-13 17:09:32 | 只看该作者
本帖最后由 不点 于 2013-11-13 17:59 编辑
请不点分析一下,有可能是什么时候驱动器号由 0x80 变成 00 的呢?
问题是否因为从 FDD 模式启动,BIOS 却分配了驱动器号 0x80,grldr 认为它是异端,从而重新设置驱动器号 00?


对不起,时间长了,我的记忆有些模糊了。我会尽快研究,究竟我编写的代码,在何时把 0x80 强制设置为 00。请耐心等待。

找到问题了,在这里(common.c):

  1.         /* check if there is a valid volume-boot-sector at 0x7C00. */
  2.         if (probe_bpb((struct master_and_dos_boot_sector *)0x7C00))
  3.                 goto failed_dos_boot_drive;
  4.         dos_part_start = *((unsigned long *) (0x7C00 + 0x1C));
  5.         j = (dos_part_start ? 0x80 : 0);
  6.         k = ( j | ((*(unsigned short *)(0x7C00 + 0x1A) - 1) << 8)
  7.                 | ((*(unsigned short *)(0x7C00 + 0x18)) << 16) );
  8.         if (! k)
  9.                 goto failed_dos_boot_drive;
  10.         boot_drive = j;
  11.         dos_drive_geometry = k;
复制代码
如果 0000:7C00 处能够探测到一个合法的 BPB 结构,就看偏移 0x1C 处是否为 0。如果不为 0,就认为是从硬盘 0x80 启动的;如果为 0,就认为是从软盘 00 启动的。

看来这个逻辑是有问题的。

请暂时将

j = (dos_part_start ? 0x80 : 0);

改成

j = boot_drive;

并注释掉后面的

boot_drive = j;

这一句(【补充】上述修改方案应该对 0.4.5c 和 0.4.6a 同时实施)。

以后可以研究是否可以用 BPB 里面的 drive_number 字节(对于 FAT32 来说,它是在 0x40 处)来确定启动盘。

注意,BPB 不一定是 grub4dos 的。如果 BPB 总是 GRUB4DOS 的,那么我们就可以放心地用 BPB 里面的 drive_number 了。但是,从历史来看,BPB 里面的 drive_number 是可靠的。注意,U 盘上的 BPB 信息不可靠,它可以在加载后被 BIOS 修改。比如,0x1C,0x18,0x1A,以及 drive_number 等信息都可以被修改。修改是在内存 0000:7C00 的扇区进行的,介质上的真实数据不会被修改。只有一个例外,微软新型的 exfat 不支持 BPB。当然了,yaya 也可以像 ext2 分区的 BPB 那样(是我设计的),为 exfat 格式设计一个 BPB,用于 grub4dos 的启动过程。内存 0x7C00 处的 drive_number 和 CHS 应该总是可靠的。

至于说为什么要采用 BPB 里面的信息,是因为微软的 NTLDR 以及 BOOTMGR 的启动过程就是根据 BPB 来确定 CHS 的。这样做是可靠的,至少是与微软一致的。还记得用 chainloader 来启动 NTLDR 和 BOOTMGR 时,必须把所在分区的引导扇区装入 0000:7C00 (否则就失败)吗?其道理相同,都是因为微软在实模式期间是使用内存 0000:7C00 处的 BPB 信息的。

微软的 exfat 格式没有 BPB,上述代码会跳过,因而不会强制设定 drive_number 和 CHS 几何参数。

另一方面,微软的 exfat 格式没有 BPB,这说明,exfat 格式是必须采用 LBA 模式的。不知道微软的 NTLDR 和 BOOTMGR 是否支持从 exfat 启动。如果不支持,那我们也可以不支持从 exfat 启动。如果支持,那么就可以进一步分析它是否强制 drive_number = 0x80,而且 BIOS 一定支持 LBA(否则无法启动)。

总之,yaya 看着办吧。

回复

使用道具 举报

188#
发表于 2013-11-13 19:22:37 | 只看该作者
关于从三星手机启动的探索告一段落。

手机主控把内存卡和外置卡作为 2 个单元整合在一起,类似读卡器,形成 1 个 usb 设备。
内存卡分配驱动器号 00,无论使用 CHS 或 LBA 模式,均不可读。
外置卡分配驱动器号 0x80,是引导驱动器, 只能使用 CHS 模式读(通过 BIOS)。外置卡可能被格式化为 HDD 模式,但是插入手机,会屏蔽 PBR 之前扇区(即便加载 usb 驱动也是),只能作为 FDD 模式使用。如果强制使用 LBA 模式读(通过 BIOS),会干扰手机主控,使后续读扇区不正常。
回复

使用道具 举报

189#
发表于 2013-11-13 19:37:45 | 只看该作者
不知道微软的 NTLDR 和 BOOTMGR 是否支持从 exfat 启动

微软从 windows 8 开始支持从 exfat 格式启动。它也有 BPB,在 0x40 - 0x77处,只不过不是传统意义上的。它通过 int13/AH=41 探测是否支持扩展读。如果不支持,通过 int13/AH=08 获得 CHS 参数。
回复

使用道具 举报

190#
发表于 2013-11-13 19:50:16 | 只看该作者
本帖最后由 2011yaya2007777 于 2013-11-16 07:04 编辑

请 mygamexxx 明日测试,已按不点指点修正。

点评

辛苦几位大大的多曰探索,明天测试!!  详情 回复 发表于 2013-11-13 20:07
回复

使用道具 举报

191#
发表于 2013-11-13 20:07:39 来自手机 | 只看该作者
2011yaya2007777 发表于 2013-11-13 19:50
请 mygamexxx 明日测试,已按不点指点修正。

辛苦几位大大的多曰探索,明天测试!!
回复

使用道具 举报

192#
发表于 2013-11-13 21:22:12 | 只看该作者
微软从 windows 8 开始支持从 exfat 格式启动。它也有 BPB,在 0x40 - 0x77处,只不过不是传统意义上的。它通过 int13/AH=41 探测是否支持扩展读。如果不支持,通过 int13/AH=08 获得 CHS 参数。


这是个好消息。能启动了,那太好了。

微软是 bios 领域的风向标,至少以前是的。因此,微软怎么做,我们要紧盯着,学着点。比如说,微软是先调用 int13/ah=41h,然后调用 int13/ah=8,那么这就指导了我们,也应该这么做。

还有一点顺便提醒你,以前我研究过微软的 MBR、PBR、CDROM 引导扇区代码,知道了它的一些秘密。现在,微软的 CDROM 引导扇区可能已经改变了,因此,你若有时间,最好研究一下微软最新的 CDROM 引导扇区,看看它调用 BIOS 的方式有什么改变和秘密,从而指导你自己的 cdrom 引导代码的编写。比如说,以前我发现微软的 cdrom 引导代码忽略 int13 读盘的出错代码 (Carry Flag),因此我也忽略它。但是,只能在 cdrom 的情况下(即 2048 大扇区的情况下)忽略,不可以在软盘和硬盘的情况下忽略。另外,微软的 cdrom 读盘不像软盘、硬盘那样会失败,然后重试 3 次。cdrom 的读盘永远不会失败,必然成功。所以,微软忽略cdrom读盘的出错代码。微软是标准,它怎么做,我们也怎么做,亦步亦趋,学着点。因此我们知道了,cdrom 的 int13 读盘是不会失败的。即使恶意 bios 返回 CF=1 引诱你重新读,也不要上当。因为重新读盘反倒有可能故意产生死机。cdrom 的 int13 也没有 ah=0 的磁盘复位功能。如果你敢调用,恶意的 bios 就可能整死你(因为微软不调用它)。



回复

使用道具 举报

193#
发表于 2013-11-14 08:03:40 | 只看该作者
新版本无法启动,停止在begin pxe scan..._ne! ...
回复

使用道具 举报

194#
发表于 2013-11-14 09:30:44 | 只看该作者
如果 grldr 不是被加载在 0000:7C00,那么 PXE 初始化代码是被屏蔽了的,不可能执行,因而不可能显示 begin pxe scan 的信息。

请看 common.c 里面的代码。

怀疑 PBR 代码把 grldr 加载在 0000:7C00 了。应该加载在别处,比如加载在 1000:0000 或 2000:0000 处。

回复

使用道具 举报

195#
发表于 2013-11-14 09:54:40 | 只看该作者
他是从 0.4.5c 版本的 FAT32 PBR 加载的 grldr ,应当是加载到了 2000:0000。
回复

使用道具 举报

196#
发表于 2013-11-14 10:05:33 | 只看该作者
本帖最后由 mygamexxx 于 2013-11-14 10:16 编辑

用BOOTICE1.31重写PBR,grub4dos 0.4.5c还是相同情况。写入0.4.6a的分区引导记录也一样。重启手机,重新进入大容量存储模式也一样。

更改以前11-03的grldr能启动。
回复

使用道具 举报

197#
发表于 2013-11-14 12:39:39 | 只看该作者
启动 grldr 时,狂按 Ins 插入键,单步执行,看看有什么错误提示
回复

使用道具 举报

198#
发表于 2013-11-14 16:01:52 | 只看该作者
似乎不是 187 楼所示问题。
我搭建了一个模拟环境,FDD 模式,FAT16 PBR。启动时驱动器号是 00,加载 usb 驱动后改为 0x80 (原硬盘改为 0x81)。
无论按 187 楼修改与否,均能正常进入 grldr ,驱动器号仍然保持 0x80。
mygamexxx 的情况仍然是谜。

点评

估计有用的信息如下,红框部分是拨出U盘后出现的信息。  详情 回复 发表于 2013-11-15 11:35
回复

使用道具 举报

199#
发表于 2013-11-15 11:35:00 | 只看该作者
本帖最后由 mygamexxx 于 2013-11-15 12:32 编辑
2011yaya2007777 发表于 2013-11-14 16:01
似乎不是 187 楼所示问题。
我搭建了一个模拟环境,FDD 模式,FAT16 PBR。启动时驱动器号是 00,加载 usb  ...


190楼的grldr,估计有用的信息如下,粗红框部分是拨出U盘后出现的信息。磁盘扇区图中细红框是提示出错的部分。另外图片编辑了一下,人丑打个掩护,

1.jpg (121.65 KB, 下载次数: 125)

1.jpg

20131115_112755.jpg (217.76 KB, 下载次数: 132)

20131115_112755.jpg
回复

使用道具 举报

200#
发表于 2013-11-15 11:50:47 | 只看该作者
本帖最后由 mygamexxx 于 2013-11-15 12:38 编辑

190楼版本
DEBUG BOOT selected......
0x27e<1 press key (common.c,367)>
Get upper memory... 0xfc00<2 press key (common.c,372)>
Turning on gate A20... Ok.
<3 press key (common.c,394)>
Get E820 memory... 0x1c8<4 press key (common.c,425)>
Get MBI.MEM_{LOWER,UPPER} elements...
<5 press key (common.c,496)>
Begin pxe scan... <6 press key (common.c,525)>
Boot drive=80, Not CD
<7 press key (common.c,711)>

171楼版本
DEBUG BOOT selected......
0x27e<1 press key (common.c,367)>
Get upper memory... 0xfc00<2 press key (common.c,372)>
Turning on gate A20... Ok.
<3 press key (common.c,394)>
Get E820 memory... 0x1c8<4 press key (common.c,425)>
Get MBI.MEM_{LOWER,UPPER} elements...
<5 press key (common.c,496)>
Begin pxe scan... <6 press key (common.c,525)>
Boot drive=0, Not CD
<7 press key (common.c,711)>

0.5.4c, 2013-10-30版本
DEBUG BOOT selected......
0x27e<1 press key (common.c,367)>
Get upper memory... 0xfc00<2 press key (common.c,372)>
Turning on gate A20... Ok.
<3 press key (common.c,394)>
Get E820 memory... 0x1c8<4 press key (common.c,425)>
Get MBI.MEM_{LOWER,UPPER} elements...
<5 press key (common.c,496)>
Begin pxe scan... <6 press key (common.c,525)>
Boot drive=0, Not CD
<7 press key (common.c,711)>


回复

使用道具 举报

201#
发表于 2013-11-15 12:18:07 | 只看该作者
似乎不是 187 楼所示问题。
我搭建了一个模拟环境,FDD 模式,FAT16 PBR。启动时驱动器号是 00,加载 usb 驱动后改为 0x80 (原硬盘改为 0x81)。
无论按 187 楼修改与否,均能正常进入 grldr ,驱动器号仍然保持 0x80。
mygamexxx 的情况仍然是谜。


那有可能是因为你修改了 0000:7C00 的扇区数据,它的偏移 1C 处为非 0,导致旧的代码总是把 boot_drive 处理为 0x80。

在你所说的情况中,grldr 代码和测试环境都是你自己建立的,因此,跟踪调试总是可以弄清楚的(不断地打印 boot_drive 的值,看看究竟何时它被改变了)。这里很难藏得住谜。

回复

使用道具 举报

202#
发表于 2013-11-15 12:26:32 | 只看该作者
这里,显示 Begin pxe scan... 这条信息就不正常。这条信息不该显示。

对比一下,0.4.5c 的 grldr 也会显示这条信息吗?(如果有显示,那就是 bug)。

如果不是从 PXE 启动的,就不应该显示这条信息。

如果是从软盘、硬盘启动的,那么 grldr 不会被加载在 0000:7C00 处,因而 PXE 会被屏蔽掉。这样做的好处是尽量避免因 pxe 的探测过程而带来的死机(想象一下,恶意 BIOS 可以用这个办法来攻击,所以要避免这个 pxe 的扫描动作)。

从 PXE 启动时,grldr 被加载在 0000:7C00 处,此时 PXE 的代码才会执行。

回复

使用道具 举报

203#
发表于 2013-11-15 12:33:41 | 只看该作者
本帖最后由 2011yaya2007777 于 2013-11-15 12:36 编辑

从硬盘启动,也显示 Begin pxe scan... 这条信息。
我现在搭建的环境,启动前后没有改变驱动器号 0x80。未能真实还原 mygamexxx 的状况。
我希望 mygamexxx 启动 grldr 时,狂按 Ins 插入键,看看有什么提示。

点评

199,200楼是调试信息  详情 回复 发表于 2013-11-15 12:48
回复

使用道具 举报

204#
发表于 2013-11-15 12:48:41 | 只看该作者
2011yaya2007777 发表于 2013-11-15 12:33
从硬盘启动,也显示 Begin pxe scan... 这条信息。
我现在搭建的环境,启动前后没有改变驱动器号 0x80。未 ...

199,200楼是调试信息
回复

使用道具 举报

205#
发表于 2013-11-15 12:53:37 | 只看该作者
mygamexxx 在 199 楼报告,死在 bios.c,499 后,stage2.c,2119 前。

点评

从提示信息看,是不是由于是软盘格式,加载USB驱动后以硬盘格式进行启动,出现了分区表的错误导致识别问题而卡住。  详情 回复 发表于 2013-11-15 13:48
回复

使用道具 举报

206#
发表于 2013-11-15 13:48:35 | 只看该作者
本帖最后由 mygamexxx 于 2013-11-15 13:55 编辑
2011yaya2007777 发表于 2013-11-15 12:53
mygamexxx 在 199 楼报告,死在 bios.c,499 后,stage2.c,2119 前。


从提示信息看(无效的引导指针0x6F, 0x80分区表未知),是不是由于是软盘格式,加载USB驱动后以硬盘格式进行启动,出现了分区表的错误导致识别问题而卡住。

这可以在PE启动后无U盘中是否可得到佐证。

点评

是的,微软对于错误的引导扇区(BPB、分区表等)很敏感,会直接否定掉这个卷,导致这个卷不可见。  发表于 2013-11-15 14:31
回复

使用道具 举报

207#
发表于 2013-11-15 14:06:41 | 只看该作者
应当是卡在 Open default file /default ... failure 这一句。
我模拟测试,这一句顺利通过。

点评

qemu等模拟器的 bios 没有 bug,不会产生死机。但真实机有 bug(或者是故意制造的陷阱),容易在访问不存在的大扇区号时死机。  发表于 2013-11-15 14:33
回复

使用道具 举报

208#
发表于 2013-11-15 14:20:57 | 只看该作者
本帖最后由 不点 于 2013-11-15 14:43 编辑

从 199 楼给的图片来看,

显示

Processing the menu ...

pxe detect
configfile

这表示一切正常。唯一的错误在于,这个盘是 0x80,为硬盘,却没有合法的分区表,而 BPB 的 5D 处为 0 表示分区号 DH 寄存器为 0,也就是说,boot 设备和 root 设备都是 (hd0,0),于是 configfile 命令就要 “顺理成章” 地查找 (hd0,0)/menu.lst 文件,结果,可想而知,死掉了。这是因为,第一分区的分区信息是错误的。可能诱导 grub4dos 去访问不存在的扇区(太大的扇区号)。

不该把分区号设置为 0。而应该保持分区号为 FF,即,没有分区,而整个盘都是文件系统的卷。如此,configfile 就不会去查找 (hd0,0)/menu.lst 了,而是(希望它)查找 (hd0)/menu.lst。

但是,BPB 的 5D 处设置为 FF 后,盘号强制为 0,又要失败了。yaya 是不是已经有新的控制手段了?即,在 BPB 偏移 0x64 处设定盘号为 0x80 即可?是不是?

由此可以引申出一个新的建议,或者说是一个新的解决方案:

就以 PBR 的所在处为 MBR,像 grub4dos 的 三重 MBR 那样,建立同时含有分区表和 BPB 表的硬盘格式,实际上也就是双重格式,既是硬盘,也是软盘。

或者用 fbinst 来做也行。此时,只要忽略掉这个设备隐藏了的 63 个扇区(真实的 MBR 磁道),从真实的 PBR 处开始安装 fbinst,可见区的格式仍旧是 FAT32。以上这两种办法应该是没问题的,建议用后一种 fbinst 的办法,来得方便,因为 fbinst 工具软件很丰富。如此一来,硬盘啊、软盘啊,诸如此类乱七八糟的问题,就都不存在了。

你可以先把 fbinst 安装到某个 IMG 上,然后,用扇区复制的方式把这个 IMG 放到 PBR 扇区开始的位置。当然了,U 盘原来的内容就要废弃了,所以,要事先把 U 盘上重要的文件备份下来,否则就要丢弃了。

至于说 0.4.5c 也显示 begin pxe scan... ,我觉得这是 bug。 yaya 找找看,毛病在哪里?一定得排除掉它。

------------------------------

我甚至还想到了,早先曾经尝试 fbinst 而失败,其实,可能仍有挽救的余地。

其一,fbinst 安装的时候,应该选中 copy-bpb 之类的选项。其次,不仅第一扇区需要 BPB,就连后续的扇区都得有 BPB,否则,在这个机器上,位于 63 扇区上的 PBR 将没有 BPB 表,那么,手机当然就可能不承认它了。手机有可能认死了,63 扇区处一定得是含有 BPB 的 FAT32 扇区。所以,这就需要改进 fbinst,给它提供一个安装选项,把所有的扇区都添加 BPB。yaya 可不可以抽时间把这个搞定?

回复

使用道具 举报

209#
发表于 2013-11-15 14:35:13 | 只看该作者
Re mygamexxx :
199 楼假死后,拔出 u 盘,又显示了一些内容,后来死在 configfile 处?还是进入了命令行或菜单?

点评

命令行,菜单都能进入  详情 回复 发表于 2013-11-15 14:36
回复

使用道具 举报

210#
发表于 2013-11-15 14:36:33 | 只看该作者
本帖最后由 mygamexxx 于 2013-11-15 14:47 编辑
2011yaya2007777 发表于 2013-11-15 14:35
Re mygamexxx :
199 楼假死后,拔出 u 盘,又显示了一些内容,后来死在 configfile 处?还是进入了命令行或 ...


命令行,菜单都能进入,关于使用FBINST的问题,已尝试过,在手机上使用FBINST,手机重启后会出现要求格式化外置卡的提示,外置卡在手机上无法识别。
QEMU测试对于此手机U盘进行测试,0X5D处为FF的,也是返回disk error。0x5D也必须是00
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-29 00:11

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表