无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
91#
 楼主| 发表于 2014-9-4 16:27:35 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2014-9-4 17:14 编辑

修复的是 bootlace 里面的 bug,不是增强了 GPT 安装功能。

可以用GPT分区的NTLDR启动加载GRLDR,这与 bootlace 没有关系,是修改了 grldrstart.S 。

已经正式上传成功!
回复

使用道具 举报

92#
 楼主| 发表于 2014-9-4 20:24:11 | 显示全部楼层
反馈一下,是否有bug:
在我的电脑上,使用grub4dos-0.4.6a-2014-09-02版,出现“Begin PXE Scan...”的提示,足足等了近10分仲,都没能进入grub4dos菜单界面。
我这里也是这个提示,换回Grub4dos0.46a 2014. 8.19版本就正常了

请使用grub4dos-0.4.6a-2014-09-03版,grub4dos-0.4.6a-2014-09-04版在原环境分别测试。如果03版正常,04版失败,则是我引进的bug。
回复

使用道具 举报

93#
 楼主| 发表于 2014-9-5 09:45:09 | 显示全部楼层
grub4dos-0.4.6a-2014-09-03已解决此问题,无此提示了。

grub4dos-0.4.6a-2014-09-04怎样?
回复

使用道具 举报

94#
 楼主| 发表于 2014-9-5 11:08:41 | 显示全部楼层
grub4dos-0.4.6a-2014-09-05

从哪里下载的?
回复

使用道具 举报

95#
 楼主| 发表于 2014-9-5 15:26:30 | 显示全部楼层
我这里刚看到更新的grub4dos-0.4.6a-2014-09-05.
回复

使用道具 举报

96#
 楼主| 发表于 2014-9-23 15:58:13 | 显示全部楼层
使用 bootlace.com 安装 grldr.mbr 到 gpt 分区类型的设备。

点评

是否意谓着在gpt分区单硬盘上,不借助xorboot工具,用bootlace工具就可将grub4dos的启动代码头部即grldr.mbr安装在gpt分区的0扇区或某指定扇区,并由其搜索gpt分区根目录下的grldr即可启动grub4dos的菜单。 但不  详情 回复 发表于 2014-9-24 11:44
回复

使用道具 举报

97#
 楼主| 发表于 2014-9-24 12:11:23 | 显示全部楼层
在win7_x64的cmd窗口,使用 bootlace.com,执行:
bootlace --gpt 0x80
grldr.mbr安装在gpt分区的某间隙处。
回复

使用道具 举报

98#
 楼主| 发表于 2014-9-25 12:54:39 | 显示全部楼层
不点分析得很透彻。以前使用 bootlace 安装 exfat 引导代码到 u 盘,测试启动情况,记不清是在 win 98 还是 win xp(按不点的指点,应当是在 win 98),是成功的。只是第一次执行 int 13/42 读返回失败,然后执行 int 13/00 磁盘复位后再次读,成功。
后来测试 bootlace,都是在 windows 系统下写入文件,在 VM 虚拟环境的 linux 系统下写入虚拟磁盘。
看来 bootlace 的作用越来越小了。

点评

按照 不点 大师 的说法,要安全地写入到gpt分区的某间隙处,是否是比较难了。 若真如此,看来要再等等其他工具的出现,就暂时不使用bootlace来写入gpt分区了。  详情 回复 发表于 2014-9-25 15:22
回复

使用道具 举报

99#
 楼主| 发表于 2014-10-9 11:46:32 | 显示全部楼层
0.4.6a 的 map 在 “debug off ” 时显示信息,已经修正,从官网下载。

点评

好的, 我试试。 另外, 怎么生成空格前导的变量: 变量的前面好多空格。 下都丢了!!!!  详情 回复 发表于 2014-10-10 14:11
回复

使用道具 举报

100#
 楼主| 发表于 2014-10-12 11:38:10 | 显示全部楼层
可以了。  
有没有0.46

官网已经更新
回复

使用道具 举报

101#
 楼主| 发表于 2014-11-4 15:06:41 | 显示全部楼层
已经修正,并且上传。
回复

使用道具 举报

102#
 楼主| 发表于 2014-11-17 10:36:15 | 显示全部楼层
在实际机器上,使用你提供的 1.44 Mb 软盘,改名为 a.img,然后执行
map --mem  /a.img (20)
map --rehook
ls  (20)/
没有任何问题

点评

好像和机器有关。 老的台式机有问题。  详情 回复 发表于 2014-11-17 13:05
回复

使用道具 举报

103#
 楼主| 发表于 2014-11-25 16:15:02 | 显示全部楼层
build 也有错误,已经修正上传。
回复

使用道具 举报

104#
 楼主| 发表于 2014-11-25 16:31:58 | 显示全部楼层
关于 2014-11-19 补丁:
if (fb_drive_virtual && fb_drive == (unsigned char)(fb_status >> 8))  的逻辑关系是:
G4D 已经拦截 BIOS 的 int13,并且 fb 驱动器存在。
fb 驱动器的 ID 可能是 0x80,也可能是 0x00,此语句漏掉了 0x00。

似乎应当修改为:
if (fb_drive_virtual && fb_drive == (unsigned long)(fb_status))  

按说使用 G4D 的 int13,也会正确找到 fb 驱动器,使用保存的原 BIOS 的 int13 来读写驱动器。不知不点在此考虑了什么因素?
回复

使用道具 举报

105#
 楼主| 发表于 2014-11-25 20:20:27 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2014-11-25 21:23 编辑

不好意思,没有仔细斟酌。应当是建议修改为:
if (fb_drive_virtual && fb_status)  

执行 fb_mount 时,假设 G4D 已经接管 int13,假设 current_drive=00,并且假设 current_partition = 0xFFFFFF(即没有 MBR,首扇区有 FAT32 的 BPB表),此时程序设置 fb_drive=00。
然后执行 fb_init。由于没有 ud 驱动器,此时 fb_status=00,则 (unsigned char)(fb_status >> 8)=00,也即:
if (fb_drive_virtual && fb_drive == (unsigned char)(fb_status >> 8))  满足条件,然后执行 quick_hook (0)。
注意,没有 ud 驱动器存在时,是不应当执行的。

严谨一些,应当是:
if (fb_drive_virtual && fb_status  && fb_drive == (unsigned char)(fb_status >> 8))  
逻辑关系是:G4D 已经拦截 BIOS 的 int13,并且 fb 驱动器存在,而且 fb_drive 是 ud 设备。
回复

使用道具 举报

106#
 楼主| 发表于 2014-11-26 10:02:46 | 显示全部楼层
我大致比对了一下,这些代码是后加的。

按当前的 grldr,测试截图如下,可见是有问题:

(20).jpg (80.82 KB, 下载次数: 144)

(20).jpg

(0).jpg (96.35 KB, 下载次数: 142)

(0).jpg
回复

使用道具 举报

107#
 楼主| 发表于 2014-12-22 11:56:36 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2014-12-22 11:58 编辑

0.46a  2012-02-27 至 2012-03-24 有 3 个补丁。似乎与读磁盘无关。
请 mdyblog 在其他电脑测试一下,状况是否一样,以便排除主板 BIOS 适应性问题。

编译器问题确实头痛。最近排除 issues 199 的问题,反编译了 grldr,明显发现有编译错的时候。
比如 C 代码是:
  1. if (name_len == 1)  //如果名称长度=1
  2. {
  3. if ((name[0] == 0) ||       /* self 自己*/
  4. (name[0] == 1))            /* parent 父级*/
  5. goto ssss;
  6. }
  7. if (iso_type == 2)
  8. {
复制代码

编译后是:
  1. ;if (name_len == 1)
  2. ;{
  3. :0002E488 83FE01                  cmp esi, 00000001                 ;name_len=1?
  4. :0002E48B 7514                    jne 0002E4A1                                       
  5. ;if ((name[0] == 0) || (name[0] == 1))
  6. ;{
  7. :0002E48D 8B8DF0FDFFFF            mov ecx, dword ptr [ebp+FFFFFDF0] ;name
  8. :0002E493 803901                  cmp byte ptr [ecx], 01              ;name[0] > 1?
  9. :0002E496 0F87AD040000            ja 0002E949                       ;是                错误!!!!!!!!
  10. :0002E49C E9FA030000              jmp 0002E89B                      ;name[0]=0 或 name[0]=1  转到 ssss
  11. ;}

  12. :0002E949 83F802                  cmp eax, 00000002                 ;iso_type=2?
  13. :0002E94C 0F85B7FBFFFF            jne 0002E509                     ;不是                错误!!!!!!!!!!!!!!!!!!!!!!!
  14. :0002E952 E94FFBFFFF              jmp 0002E4A6                     ;是

  15. ;if (iso_type == 2)
  16. ;{
  17. :0002E4A1 83F802                  cmp eax, 00000002                ;iso_type=2?
  18. :0002E4A4 7535                    jne 0002E4DB                                ;不是
  19. ;big_to_little (name, name_len);
  20. :0002E4A6 8B9DF0FDFFFF            mov ebx, dword ptr [ebp+FFFFFDF0]        ;name
复制代码
回复

使用道具 举报

108#
 楼主| 发表于 2014-12-23 20:32:20 | 显示全部楼层
另外请yaya确认下,0.4.6a对map函数的修改是否有问题.
0.4.5c的map命令调用blocklist_func时只调用了disk_read_blocklist_func一次,而0.4.6a则调用了很多次..

为了确定映像文件的连续性,0.4.6a 确实是对没有 --mem 参数的映像文件 1 扇区 1 扇区地从头读到尾。这样确实比 0.4.5c 慢得多。
但这不是问题的根本。从 mdyblog 报告的情况看,a 与 c 速度差不多,且出问题的时间段的 3 个补丁与 blocklist_func 无关。

点评

》》为了确定映像文件的连续性,0.4.6a 确实是对没有 --mem 参数的映像文件 1 扇区 1 扇区地从头读到尾。这样确实比 0.4.5c 慢得多。 但这不是问题的根本。从 mdyblog 报告的情况看,a 与 c 速度差不多,且出问题的  详情 回复 发表于 2014-12-23 22:33
回复

使用道具 举报

109#
 楼主| 发表于 2014-12-25 20:39:12 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2015-3-16 10:19 编辑

几种方案:
1.  判断是否属于扇区序列。即便是,也不能简单跳过块列表函数。因为不连续的扇区序列也可以映射,此时需要建立映射表。要增加不少代码。
另外,对于大的文件映射,连续时,也白白浪费时间。
2.  执行块列表函数时,不真正读磁盘。效果不理想。仍然有延时,且对于不连续文件,只返回 1 组参数。没有仔细研究错在哪里。
3.  从文件分配表判断连续性。这是快捷的方法。但是文件系统类型太多,增加代码过多。

权衡利弊,觉得增加一个参数较妥。当用户确认文件连续时,可以使用该参数,加快执行速度。
参数是    --continuou

点评

这个效果好啊! 瞬间完成。 [attachimg]205437[/attachimg]  详情 回复 发表于 2014-12-26 07:55
回复

使用道具 举报

110#
 楼主| 发表于 2014-12-26 10:55:04 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2014-12-26 13:12 编辑
对于0.4.6a的这个map检测流程我看得不是很明白.

其实我也不太明白,尤其是扇区序列。
在 map 中执行 blocklist_func,原来 0.4.5c 是读文件的首扇区及末扇区,用来确定文件的首扇区(start_sector)和扇区数(sector_count)。
但是后面紧接着 disk_read_start_sector_func() 将重新设置start_sector和sector_count。因此,对于 0.4.5c,
if (mem == -1ULL)
{
......
}
可以删除。

对于 0.4.6a,此处是用来确定文件的连续性,获得各段文件起始及扇区数。
前面描述的不对,确定连续性也不是 1 扇区 1 扇区地读。fat,iso9660 是最大 4 扇区,ntfs 是最大 8 扇区。

个人认为使用一个额外的参数来解决不太好,对于用户来说能够不用参数就尽量不要使用.越简单越好.

那就采用:如果是连续的扇区序列,则跳过连续性检查。
我已经上传了一个补丁,打在我的分支,不知这么没有进入你的主干。如果可能的话,请帮忙撤销,或者告诉我如何撤销。
回复

使用道具 举报

111#
 楼主| 发表于 2014-12-30 17:12:49 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2014-12-31 20:23 编辑

关于变量 long query_block_entries(查询块项) 的探讨:

0.4.5c:初始化=0; 外部3处测试连续性设置=-1;函数返回1=连续,2=不连续,3=压缩文件认为不连续,0=程序失败(撤销请求‘-1’,回归0)。
0.4.6a:初始化=0; 外部3处测试连续性并且获取分段参数设置=-1;函数返回 blklst_num_entries(块列表项数=0~n),3=压缩文件,-1=程序失败。

disk_read_blocklist_func 函数是根据 query_block_entries 变量判断:
0.4.5c: >=0,是命令行调用,需测试文件全部长度,并打印信息; <0,是 G4D 内部调用,仅判断连续性,只测试文件首扇区及末扇区,不打印信息。
0.4.6a: >=0,是命令行调用,需测试文件全部长度,并打印信息; <0,是 G4D 内部调用,获取分段参数,需测试文件全部长度,不打印信息。
因此,程序失败时返回 ‘-1’ 不妥,应当撤销请求 ‘-1’,回归0。否则紧接命令行调用时,会出错。
另外返回 3 也没有意义,并且会被错误认为 blklst_num_entries=3。

发现 1 个 bug:
执行    blocklist (hd0)+0x20000000
返回    (hd0)
错误定位在
  1. blocklist_func (char *arg, int flags)
  2. {
  3.   char *dummy = NULL;
  4.   int err, i;
复制代码

应当是
  1. blocklist_func (char *arg, int flags)
  2. {
  3.    char *dummy = NULL;
  4.   int i;
  5.   unsigned long long err = 0;
复制代码

回复

使用道具 举报

112#
 楼主| 发表于 2014-12-31 20:30:39 | 显示全部楼层
又发现 1 个 bug:
执行:blocklist (md)+0xffffffff
返回:(md)0+-1
错误定位于:
  1. diff --git stage2/builtins.c stage2/builtins.c
  2. @@ -420,7 +421,7 @@ blocklist_func (char *arg, int flags)
  3.    if (blklst_num_sectors > 0)
  4.      {
  5.        if (query_block_entries >= 0)
  6. -        grub_printf ("%s%ld+%d", (blklst_num_entries ? "," : ""),
  7. +        grub_printf ("%s%ld+%ld", (blklst_num_entries ? "," : ""),
  8.                  (unsigned long long)(blklst_start_sector - part_start), blklst_num_sectors);
  9.        else if (blklst_num_entries < DRIVE_MAP_FRAGMENT)
  10.         {
复制代码

grub4dos-0.4.6a-2014-12-31.7z

269.67 KB, 下载次数: 12

点评

好像对于有碎片文件的仿真变坏了. 我有两个vhd文件,使用原来2014-11-27的0.46a版本可以启动. 但是2014-12-31 的 0.46a都是因为不连续不能启动.  详情 回复 发表于 2015-1-1 11:47
回复

使用道具 举报

113#
 楼主| 发表于 2015-1-2 09:06:17 | 显示全部楼层
Re 2011niumao :
请测试一下官网的 0.4.6a 24/25/27 版本,准确定位。

会打印出 没有 /IMG/SSHYDOS.IMG.SH。

不点要求,命令行没有成功执行的命令,应打印出错信息,以便提醒操作者。chenall  按此做了更改。

点评

官网的 0.46a 24/25都正常引导.27不行.出现错误.  详情 回复 发表于 2015-1-2 10:14
官网的 0.46a 24/25都正常引导.27不行.出现错误.  发表于 2015-1-2 10:11
我作为一个 bug 报告者,发现了 bug,并加以报告。chenall 对 bug 报告进行了处理。  详情 回复 发表于 2015-1-2 10:10
>会打印出 没有 /IMG/SSHYDOS.IMG.SH。 >不点要求,命令行没有成功执行的命令,应打印出错信息,以便提醒操作者。chenall 按此做了更改。 --------------- --config-file=" 应当 当作内置菜单一样看待,这里不  详情 回复 发表于 2015-1-2 09:44
回复

使用道具 举报

114#
 楼主| 发表于 2015-1-2 20:11:34 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2015-1-3 09:58 编辑

请 2011niumao 测试一下。

点评

遵照mydblog大元帅的建议.我重新测试了一下.虚拟机上看====很成功====没有问题. 制作一个8G的VHD,模拟硬盘 .在8G vhd上做了一个2G vhd 模拟虚拟硬盘.把2G分两个区,前面ext4 后面fat32 结果map以后都可启动,可以找  详情 回复 发表于 2015-1-3 19:08
还是不能引导.问题依旧.还是那个图片显示的错误.  详情 回复 发表于 2015-1-2 22:34
回复

使用道具 举报

115#
 楼主| 发表于 2015-1-4 16:11:24 | 显示全部楼层
按 664# 菜单,怎么会在 651# 映射出 4 个硬盘?

点评

哦。这个倒不是问题。是我在该项引导失败后回车回到主菜单,修改一下后,继续按该菜单再引导一次,又多出一块模拟硬盘啦。重复引导三四次,中间没有重启,每次都会多出一个模拟硬盘。  详情 回复 发表于 2015-1-4 16:41
回复

使用道具 举报

116#
 楼主| 发表于 2015-1-8 16:29:33 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2015-1-8 16:53 编辑

扇区数少了 0x800000 的倍数。按说也没有超过 4 字节呀。

请教 chenall ,这里是否需要修改:
if (rw_flag != 0x900ddeed && rw_flag != 0xedde0d90 && rw_flag != GRUB_LISTBLK)
  {//for old devread with 32-bit byte_offset compatibility.
    rw_flag = *(unsigned long*)(&write - 1);
    if (rw_flag != 0x900ddeed && rw_flag != 0xedde0d90 && rw_flag != GRUB_LISTBLK)
      return !(errnum = ERR_FUNC_CALL);

点评

新的blocklist会根据length长度计算扇区数.之前length是unsigned long的,超过4G的话就会出错  详情 回复 发表于 2015-1-8 16:59
这个GRUB_LISTBLK标志只有grub4dos内部使用,不必考虑外部命令 这一段代码是为了兼容以前旧版函数的(主要是旧版的外部命令).不必修改.  详情 回复 发表于 2015-1-8 16:51
回复

使用道具 举报

117#
 楼主| 发表于 2015-1-20 20:16:47 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2015-1-21 14:57 编辑

请 DavidBrenner3 以及加载 usb2.0 失败时反馈信息。
回复

使用道具 举报

118#
 楼主| 发表于 2015-1-25 10:13:02 | 显示全部楼层
报告说不能启动 .iso,我这里测试没有问题。2015-01-22 的改动有可能影响 usb-cdrom,但是报告者不是这样的。
回复

使用道具 举报

119#
 楼主| 发表于 2015-2-2 22:14:38 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2015-2-25 10:27 编辑

初步定位是 get_diskinfo 函数从 exfat 分区获得:Smax=0xff,Hmax=0x100。从而使 in_situ 置 1,惹出麻烦。
get_diskinfo 函数比较复杂,没看明白是怎样造成的。
回复

使用道具 举报

120#
 楼主| 发表于 2015-2-3 06:45:52 | 显示全部楼层
所以说比较奇怪。得仔细探讨一下。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-26 13:20

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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