无忧启动论坛

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

反馈一个 grldr.mbr 0.4.6a 的 bug

  [复制链接]
发表于 2013-11-8 10:12:05 | 显示全部楼层
从 80h 启动的时候,即使 0x410 反馈有软盘,调用 DL=0 的 int13 也会出问题?


那是当然的了。恶意的 BIOS 就是这么可恶。它要是在 0x410 处指示没有软盘,那么 find --set-root 命令就不会去访问软盘,也就不会有问题了,而我们也就不会去到处宣传 “find --set-root(不带 --ignore-floppies)是错误的用法” 了。指示有软盘,引诱去访问,这才是破坏的窍门。否则它根本就破坏不了。访问虚假软盘时,有的是真死了,有的是假死了。假死的,也有 5 分钟以上的迟滞时间,太久了,如果只有 30 秒,还可能是 bug;超过 1 分钟,我认为就是攻击。因此我认为这纯粹是攻击。

回复

使用道具 举报

发表于 2013-11-8 10:15:40 | 显示全部楼层
本帖最后由 mygamexxx 于 2013-11-8 10:17 编辑

H/S的更改在明基笔记本上也一样,与更改后的一致。hd0访问时,不拨出U盘会在10分钟左右后出现disk read error, 没有死机。
回复

使用道具 举报

发表于 2013-11-8 11:40:21 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2013-11-10 21:54 编辑

测试环境:
在手机上格式化的卡(即FDD模式),0.4.5c版本, 0x18 处为 3F,0x1A 处为 FF, 0x1C 处为 00,0x5D 处为 00。
卡插入手机,通过 usb 连接明基笔记本,拔掉其他 usb 设备。
冷启动。

测试状况:
显示一部分信息后,等待1分钟,再显示一部分信息,即进入死循环。
正面拍照,清晰度高一些,确保数字可以辨认。
回复

使用道具 举报

发表于 2013-11-8 11:46:27 | 显示全部楼层
syslinux不能正常转grldr的测试模板:http://pan.baidu.com/s/169ojQ
用U+方式写入U盘即可进行测试。

下载模板后,用U+方式写入U盘,测试正常。看到是0.4.6a 2013_11_02版本。

点评

我这里是出不了中文菜单的,你的能出吗?换回4.5c没有问题。  详情 回复 发表于 2013-11-8 16:21
回复

使用道具 举报

发表于 2013-11-8 12:13:29 | 显示全部楼层
本帖最后由 mygamexxx 于 2013-11-8 12:37 编辑

内置菜单能不能我把它改成commandline, 因为有find 语句会卡住。
内置菜单选择commandline后,成功进入命令行,其他情况与以前一样。
回复

使用道具 举报

发表于 2013-11-8 12:25:33 | 显示全部楼层
不用改,程序只执行以部分。

点评

立即进入内置菜单了,分区引导记录是0.4.5c,显示grldr是0.4.6是2013-11-03  详情 回复 发表于 2013-11-8 12:27
回复

使用道具 举报

发表于 2013-11-8 12:27:36 | 显示全部楼层
本帖最后由 不点 于 2013-11-9 09:40 编辑

CDROM 驱动在哪个文件里?挂载后是否分配了 BIOS 驱动器号?客户程序如何获知并调用 CDROM?

在 int13 处理程序里(asm.S)。挂载后分配的盘号是在 0xC0 至 0xE8 之间。之所以是不确定的,是因为需要避免与 (cd) 相冲突,因为 (cd) 是 BIOS 传入的 no-emulation mode 的 CDROM 盘号,它在 0x80 至 0xFF 之间变动,它是不确定的。所以,由 cdrom --init 所建立的 (cd0), (cd1), ... (cd7) 也是不确定的。但 (cd0), (cd1), ... (cd7) 的盘号是连续分配的,比如说,它们可能是 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7;或者可能是 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7。

客户程序无需关注具体的 BIOS 盘号。用 (cd0), (cd1), ... (cd7) 来访问便可。

假如 U 盘以 80h 启动,后来使用 usb --init  挂载,加载了 usb 驱动后,原来 BIOS 的 usb 驱动就失效了。此时使用 DL=80h 的 int13 ,同样会死机。估计 find 或其他函数会探索磁盘。

即使原来的 (hd0) 失效了也没关系。失效了就不用它了。把这写入文档,一切 OK。正如我们警告用户不可以随便使用 find --set-root 那样,启用 USB 驱动之后,就不要使用原来的 USB 设备(fd0 和 hd0)了。既然新的 USB 驱动是成功的,那用户没有理由再去访问原来的 hd0 或 fd0 了。用户可以(用某条命令)把新的 USB 设备挂在 fd0 或 hd0 或任意别的盘号上。

目前的 cdrom --init 能够发现多个 CDROM 驱动器,它们分别用 (cd0), (cd1), ... (cd7) 来访问。
类似地,你的 usb --init 也可以发现多个 USB 驱动器,比如说,它们分别用 (sd0), (sd1), ... (sd7) 来访问。普通的 USB 软盘、硬盘可以支持,甚至 USB-CDROM 也是可以支持的。这里的 (sdN) 共 8 个,你可以把它们的实际盘号记录在数组变量 usb_drive[8] 中,数组的每个元素占用单字节,数组就放在 int13 处理程序开头的那些未使用的保留区域(asm.S)中。

在 cdrom --init 的情况下,(cd0), (cd1), ... (cd7) 的盘号是连续分配的。

  1. ENTRY(atapi_dev_count) .byte 0
  2. ENTRY(min_cdrom_id) .byte 0xE0
复制代码
min_cdrom_id 就对应于 (cd0),atapi_dev_count 的最大值是 8。(min_cdrom_id + atapi_dev_count - 1) 就是已经被驱动成功了的最大的 (cdN) 的 BIOS 盘号。

在 usb --init 的情况下,以上这些 cdrom 的变量都作废了。(sdN) 盘号不再连续分配,而是可以由某个命令行参数来控制的,而且在驱动建立以后,盘号也可以用某条命令来随意修改。

比方说,usb_drive[8] 数组可以放在如下的保留空间中(选择一个永远也用不着的盘号 0x3F 作为初始值):
  1. VARIABLE(saved_pxe_mac)

  2. .byte 0, 0, 0, 0, 0, 0

  3. /* space reserved. */

  4.         . = int13_handler + 0x130

  5. VARIABLE(usb_drive)
  6. .byte 0x3F
  7. .byte 0x3F
  8. .byte 0x3F
  9. .byte 0x3F
  10. .byte 0x3F
  11. .byte 0x3F
  12. .byte 0x3F
  13. .byte 0x3F

  14. /* space reserved. */

  15. . = int13_handler + 0x140
复制代码
必须放在偏移 0 至 0x140 之间,才能保证以后(在进入 DOS 而启动 grub.exe,或者当用 chainloader 启动了一个新的 grldr 时)让这些盘号的设置能够在新的 grub 环境仍然起作用。


补充一下:

鉴于 USB 启动的复杂性、困难性,可以简单地实现,不要实现得太庞大。

比如说,发现启动盘是 fd0,就把 USB 驱动的新盘也定为 fd0,发现启动盘是 hd0,就把 USB 驱动的新盘也定为 hd0。

这样做就安全了。如果发现多个 USB 设备,不要去驱动多余的设备,只驱动与启动盘相对应的 USB 设备。这样也就不需要很多个 (sdN) 了,而是只要有一个单字节变量 usb_drive 来做就够了。

usb --init 之后,默认的 usb_drive 设定为当初的启动盘 (fd0) 或 (hd0)。此后,为了灵活性,用户可以调整 usb_drive 的盘号为其他任意的盘号。

由于只需要单字节的 usb_drive 盘符,因此,可以在 int13_handler 的开头(在偏移 0 的附近处)找一个空白无用的字节来存放 usb_drive。也尽量不要覆盖掉原来的 min_cdrom_id 和 atapi_dev_count,也不要挪动它们的位置。也许有人将来想同时支持 cdrom 和 usb,因此我们就不要破坏了这样的可能性,我们要尽量提供方便,给未来的开发者留有余地。

位于偏移 0 至 0x140 的字节都是不变的,不同的 grub4dos 版本,仿真代码的开头 0x140 个字节的意义是相同的,各变量的位置是固定的,这样就保持了 grub4dos 新旧版本仿真代码中的关键数据结构的兼容性。新设计一个变量,一开始就应该把它的位置设计好,一旦确定,将来就不能动了,因为兼容性在制约着这一切。如果动了,那就破坏兼容性了。因此,设计的时候,就要注意节约,不要浪费。如果只是需要一个字节来保存 usb_drive 的值,那么目前我认为最节约的位置是在偏移 0x01 处,这里刚好保留了一个字节。这个 usb_drive 的初始值可以是 0x3F(它表示没有 usb_drive),但 usb 驱动程序初始化的时候,有可能把它改成 0x00 或 0x80,而用户也可能根据需要而把它改成别的任何一个盘号。

要有灵活性。如果用户发现 usb 驱动的存在影响了 Windows 的后续行为,导致 Windows 无法识别 usb 设备,或者出现别的故障,那么,给用户一个机会,让用户有可能在启动 Windows 之前卸载 usb 驱动。如果把 usb_drive 设置为 0x3F,那就相当于卸载了 USB 驱动。


回复

使用道具 举报

发表于 2013-11-8 12:27:44 | 显示全部楼层
本帖最后由 mygamexxx 于 2013-11-8 12:45 编辑
2011yaya2007777 发表于 2013-11-8 12:25
不用改,程序只执行以部分。


立即进入内置菜单了,分区引导记录是0.4.5c,显示grldr是0.4.6是2013-11-03,停留在Booting 'find /menu.lst, /boot/grub/menu.lst, /grub/menu.lst', 下一行,光标闪动。15分钟后还是在光标闪动。
回复

使用道具 举报

发表于 2013-11-8 12:49:47 | 显示全部楼层
重新从123楼下载,再测试。强制加载usb驱动。

点评

先上图  详情 回复 发表于 2013-11-8 13:00
回复

使用道具 举报

发表于 2013-11-8 13:00:57 | 显示全部楼层
2011yaya2007777 发表于 2013-11-8 12:49
重新从123楼下载,再测试。强制加载usb驱动。


先上图
1.jpg
2.jpg
虚拟机启动.jpg
回复

使用道具 举报

发表于 2013-11-8 13:16:18 | 显示全部楼层
实机测试

点评

现在是实机  详情 回复 发表于 2013-11-8 13:27
回复

使用道具 举报

发表于 2013-11-8 13:27:36 | 显示全部楼层
2011yaya2007777 发表于 2013-11-8 13:16
实机测试


现在是实机
1.jpg
2.jpg
3.jpg
回复

使用道具 举报

发表于 2013-11-8 14:03:11 | 显示全部楼层
你再使用0.4.6a 2013_11_02版本测试一下,按F2强制加载,看U盘是fd0还是hd0.
回复

使用道具 举报

发表于 2013-11-8 16:21:13 | 显示全部楼层
2011yaya2007777 发表于 2013-11-8 11:46
下载模板后,用U+方式写入U盘,测试正常。看到是0.4.6a 2013_11_02版本。

我这里是出不了中文菜单的,你的能出吗?换回4.5c没有问题。
回复

使用道具 举报

发表于 2013-11-8 16:23:04 | 显示全部楼层
本帖最后由 mygamexxx 于 2013-11-8 16:54 编辑

上图, 0PE是1.4.9, 2013.08.08版本
0PE按空格.jpg
0PE未按空格.jpg
加载USB驱动.jpg
未加载USB驱动.jpg
回复

使用道具 举报

发表于 2013-11-8 16:46:34 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2013-11-8 16:47 编辑

如果可能的话,还请你再测试一下今天上传的grldr,看看与132楼有何不同。辛苦了。

点评

是123楼的吗?  详情 回复 发表于 2013-11-8 16:56
回复

使用道具 举报

发表于 2013-11-8 16:56:15 | 显示全部楼层
2011yaya2007777 发表于 2013-11-8 16:46
如果可能的话,还请你再测试一下今天上传的grldr,看看与132楼有何不同。辛苦了。


是123楼的吗?要明天测试了。
回复

使用道具 举报

发表于 2013-11-8 17:03:13 | 显示全部楼层
好吧
回复

使用道具 举报

发表于 2013-11-8 17:22:26 | 显示全部楼层
我这里是出不了中文菜单的,你的能出吗?换回4.5c没有问题。


我猜测 0.4.6a 的当前盘号(DL寄存器)或者当前分区号(DH寄存器)没有正确传递,导致找不到正确的默认 root 设备,因而访问菜单文件失败。

0.4.6a 是不是要写入内存的 0000:7C00 扇区?这个地方的扇区数据不要动,当前盘号和分区号有可能使用这个地方的 512 字节数据来确定。这个地方通常保存着启动盘的引导扇区(PBR)的数据。这是个很有用的数据,在没有别的办法确定启动盘的时候(比如从 syslinux 启动就可能是这样的情况),grub4dos 会参考 0000:7C00 处的扇区数据,并据此猜测(和确定)启动盘的启动分区。

回复

使用道具 举报

发表于 2013-11-8 19:08:27 | 显示全部楼层
我测试,从 syslinux 菜单进 grub4dos 菜单,看到显示 grub4dos 的内置菜单,然后显示 (HD0,3),就出来 grub4dos 菜单。从 grub4dos 菜单进 syslinux 菜单好像显示了什么,没有看清楚。2 个菜单都有中文。是进了 grub4dos 菜单,中文显示乱码吗?还是如 99 楼“syslinux作一启,再转grldr失败了,不出菜单,假死状态,将U盘拔一下再插入菜单就出来了”,此时中文显示乱码?

0.4.6a 没有写入内存的 0000:7C00 扇区。从 syslinux 使用 RUN 命令直接加载 grldr 。可能当前分区号(DH寄存器)没有正确传递。是不是内置菜单查找 grldr 时,我这里找到 u 盘的,hhh333 那里找到硬盘的了。
回复

使用道具 举报

发表于 2013-11-8 23:52:09 | 显示全部楼层
有个小问题请yaya大顺便处理一下。

目前发布的grub4dos-0.4.6a-2013-11-02.7z和grub4dos-0.4.5c-2013-10-30.7z,其样例sample/menu.lst中
  1. title 0PE LiveISO
  2. find --set-root --ignore-floppies --ignore-cd /0PE/0PE.ISO
  3. map /0PE/0PE.ISO (0xff)
复制代码
这段最好改下路径,改为
  1. title 0PE LiveISO
  2. find --set-root --ignore-floppies --ignore-cd /0PE.ISO
  3. map /0PE.ISO (0xff)
复制代码
因为很久以来实际部署的0PE.ISO是设计放在根目录的。

最早该文件确实曾放在0PE文件夹(目前0pe的grldr内置菜单也还有一段:
  1. #可改0PE.ISO的路径、名字。默认/0PE.ISO。指定的不存在,就找/0PE/0PE.ISO。
  2. if not exist PEISO set PEISO=/0PE.ISO
复制代码
系为使用者改变路径、名字预留)。
但后来发现这单一文件放在根目录最简洁,尤其给用户介绍起来最省力。
回复

使用道具 举报

发表于 2013-11-9 07:47:06 | 显示全部楼层
目前发布的grub4dos-0.4.6a-2013-11-02.7z和grub4dos-0.4.5c-2013-10-30.7z,

知道了。下次提交时把0.4.6a修改了。
回复

使用道具 举报

发表于 2013-11-9 08:59:05 | 显示全部楼层
这是11-03的,未加载USB驱动
20131109_083312.jpg
回复

使用道具 举报

发表于 2013-11-9 10:41:18 | 显示全部楼层
本帖最后由 不点 于 2013-11-9 11:04 编辑

yaya,我认为 usb 驱动只是一个选择,不能当成全部的、必然的。

一方面,usb 驱动不一定完善,不一定能够驱动所有的硬件;另一方面,usb 驱动(即使成功驱动了,也)还可能带来别的潜在问题。因此,不能指望 usb 驱动能够有着太高的成功率。如果主板不支持 USB 启动,那么 usb 驱动的威力也就没办法发挥出来。假定我们的讨论就限定在主板支持 usb 启动的情况下(并且讨论范围限定在非 usb-cdrom 启动的情形),此时主板的 bios 是 100% 成功启动的。而 usb 驱动的成功率最多也就是 100%,不可能超过 100%。实际的情况可能出现失败,因而就达不到 100% 的成功率了。

所以,从逻辑上、哲学上讲,主板本身的 BIOS 才是重中之重。像前面测试中遇到的从 0x80 成功启动 grldr,而进入 grub 环境之后却无法访问 0x80 了。这肯定可以解决的。不管它是什么原因,一定能找到。因为引导代码就能成功,成功与失败都摆在我们眼前,而不是在遥不可及的远方,所以,一定可以找到成功与失败的差别所在,也就一定可以定位出 bios 的毛病在哪里。我前面已经提到了,很可能 bios 不支持一次读取 127 扇区。只要调整 grub4dos 的磁盘读取方式,让它每次读一个扇区,我估计这个问题就可以解决。不可以忽略这个问题而把 usb 驱动当成主要手段。bios 是 100% 成功的,它才是主要手段。usb 驱动不是 100% 成功的,它只能是次要手段、辅助手段。我想在哲学概念上澄清这一问题,希望能够对开发工作起到某些作用。

usb 驱动的主要好处在于,一旦成功,它可以支持 LBA 模式,能够访问全部的扇区,这比那些恶意的 bios 强,因而可以摆脱恶意 bios 的控制了。有些 bios 只有 720K 的访问能力,那么就很难加载一个 WinPE 了。

同时,usb 驱动可以提高 usb 的访问速度,这是又一大好处。

在开发 usb 驱动的同时,如果发现 grub4dos 内核中有不适应主板 bios 的情况,那还是要加大力度去解决的,不能放弃。应该区分什么事是可能解决的,什么事是一定能够解决的,什么事是很难解决的,什么事是不可能解决的。那些一定能够解决的问题,是重中之重,不能视而不见。而对于那些不可能解决的问题,就应该放弃。头脑中应该对此类事情很清醒。当然不是说发现问题,立刻就要解决。但我觉得不可以把这事给忘了、给淡化了。

回复

使用道具 举报

发表于 2013-11-10 12:03:52 | 显示全部楼层
本帖最后由 hhh333 于 2013-11-10 12:23 编辑

用这个2G的U盘在另一台电脑上试的结果如下:
IMG_20131110_110345.jpg
等待大约5分钟以后出现:
IMG_20131110_114001.jpg

又用一个读卡器试了一下,情况更加乱了,出过一次中文件菜单后后就出现:
IMG_20131110_112337.jpg

IMG_20131110_112539.jpg

IMG_20131110_112959.jpg

IMG_20131110_113255.jpg

文字提示越来越少.
在没出提示符之前拔掉读卡器或U盘菜单出来了:
IMG_20131110_120846.jpg

将这两个盘的grldr换成4.5c,这些怪现象不见了。看来,目前升级到4.6a的时机还不成熟!

回复

使用道具 举报

发表于 2013-11-10 12:37:14 | 显示全部楼层
将这两个盘用bootice改PBR为grldr4.6a作第一启动,一切正常。
回复

使用道具 举报

发表于 2013-11-10 21:53:13 | 显示全部楼层
将这两个盘用bootice改PBR为grldr4.6a作第一启动,一切正常。

经测试,0.4.6a 可以正确地传送启动分区 DH 。
当 linux 将 grldr 全部加装到 0x7c00 ,是没有分区信息的。

0.4.6a 比 0.4.5c 文件大,将 0.4.5c  换成 0.4.6a ,是否产生了碎片?没有加载全?
回复

使用道具 举报

发表于 2013-11-10 21:56:36 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2013-11-11 11:31 编辑

请 mygamexxx 按123楼的要求再测试1次。拜托了。
2次等待30秒。

点评

停在 0 D80R27_ 5分钟了不动  详情 回复 发表于 2013-11-11 08:10
回复

使用道具 举报

发表于 2013-11-11 08:10:09 | 显示全部楼层
本帖最后由 mygamexxx 于 2013-11-11 08:41 编辑
2011yaya2007777 发表于 2013-11-10 21:56
请 mygamexxx 按123楼的要求再测试1次。拜托了。
2次等待30秒。


停在
0
D80R27_
5分钟了不动

30分钟了还是不动
回复

使用道具 举报

发表于 2013-11-11 11:33:03 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2013-11-11 16:41 编辑

奇怪,同样的环境,上次拍照不死机,这次死机了。
用这个测试一下。10秒拍照时间。

点评

在下图的界面,停止了几分钟还是不动  详情 回复 发表于 2013-11-11 12:03
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 12:42

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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