找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777

支持含有碎片的文件仿真

   火... [复制链接]
 楼主| 发表于 2015-2-8 17:53:54 | 显示全部楼层
有报告0.4.6a的grldr.mbr出问题的

已经修正,上传管网。

点评

Well, after many tests, it seems that the MBR/PBR from the latest 0.4.6a versions is buggy. The MBR is having problems finding GRLDR on partitions with file system type NTFS and displaying error me  详情 回复 发表于 2015-2-9 22:31
辛苦了,我让他再测试一下看看  详情 回复 发表于 2015-2-9 10:08
回复

使用道具 举报

发表于 2015-2-9 10:08:39 | 显示全部楼层
2011yaya2007777 发表于 2015-2-8 17:53
已经修正,上传管网。

辛苦了,我让他再测试一下看看
回复

使用道具 举报

发表于 2015-2-9 17:25:55 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-9 21:45 编辑

反应个现象。
为什么GRUB4DOS访问盘末尾是出现 “不支持LBA64”?
盘才64G, 32位LBA 地址就够了。

访问磁盘尾部的6M系统, 如图:

00067.png
00068.png

----------------补充测试----------------------
当尾部系统增加到8M时问题显示有不同。
00070.png

----------------补充测试----------------------
当尾部系统增加到8.065M时问题显示有不同。没有任何提示,就是菜单读不出来。
00071.png


----------------补充测试----------------------
当尾部系统增加到8.125M时就没问题了。菜单显示出来了。
00072.png





1:U盘分区表
磁盘:1
  磁盘信息 磁盘号   大小(字节)         柱面数 磁头数 扇数 扇区 媒体     签名 总线
              1    63786975232           7754    255   63  512   12 55276D56  7 MBR F
  字符说明 激活 __本分区起始__ 分区 __本分区结束__ _______本分区______ ______本分区_______
  激活为0x80    磁头_扇区_柱面 类型 磁头_扇区_柱面 _____起始扇区号____ _____扇区总数______
  主分区1: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  主分区2: 0x00 0xFE 0xFF 0xFF 0x0F 0xFE 0xFF 0xFF 0x69 0xB4 0xE0 0x01 0x54 0xE6 0xC1 0x03
  主分区3: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  主分区4: 0x00 0x00 0x02 0x00 0xFE 0x00 0x02 0x00 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00
  标志   : 0x55 0xAA
  全部分区: -1  @2  -3  1   2   3
  分区  类型 激活(1) 起始(字节)     长度(字节)    隐藏扇区     结尾(字节) 物理# 盘符
    -1  0x00   0              0              0           0              0    1   
    @2  0x0F   0    16129774080    32275998720    31503465    48405772800    2   
    -3  0x00   0              0              0           0              0    3   
     1  0xFE   0            512            512           1           1024    4   
     2  0x0B   0    16129806336    16137967104          63    32267773440    5  G:
     3  0x0B   0    32267805696    16137967104          63    48405772800    6  H:

2:尾部的6M系统不在分区表中(深度隐藏的)

map --in-situ (hd0)XX+YY (hd0)
...
来映射的虚拟磁盘。


3:可能是QEMU虚拟机的问题。
62291968K /63s /255 = 7754.99134765017
不是整数 个 柱面,
最后的零碎: 62291968K - 7754. * 63s * 255 = 8154112 = 7.7763671875M    (一个柱面7.84423828125M < 8M)
和上面的测试比较接近, 但相差0.3486 M   

-----------------后续----------------
“相差0.3486 M”可能是grldr-文的空间, 将menu.lst 挤到到后面了。
只留menu.lst, 7.85M
测试i通过。如图:

00075.png

这恰好对应 后面那个柱面零碎。


点评

出错信息是 qemu 的主板 BIOS 发出的,不是 grub4dos 发出的。 1、试试 0.4.5,看看是否有相同的问题,方便开发者追踪问题的根源。 2、盘上的分区表是否不正常?假如分区起始扇区号为 0xFFFFFFFF,分区长度为 0x  详情 回复 发表于 2015-2-9 17:43
回复

使用道具 举报

发表于 2015-2-9 17:43:06 | 显示全部楼层
mdyblog 发表于 2015-2-9 17:25
反应个现象。
为什么GRUB4DOS访问盘末尾是出现 “不支持LBA64”?
盘才64G, 32位LBA 地址就够了。

出错信息是 qemu 的主板 BIOS 发出的,不是 grub4dos 发出的。

1、试试 0.4.5,看看是否有相同的问题,方便开发者追踪问题的根源。
2、盘上的分区表是否不正常?假如分区起始扇区号为 0xFFFFFFFF,分区长度为 0xFFFFFFFF,那么这就可能超出 32 位的范围,需要访问 64 位的扇区号了。

to 开发者:

用跟踪调试等手段检查代码,看看什么代码导致 64 位的扇区号被传入主板 BIOS int13,造成问题。

点评

1:U盘分区表 磁盘:1 磁盘信息 磁盘号 大小(字节) 柱面数 磁头数 扇数 扇区 媒体 签名 总线 1 63786975232 7754 255 63 512 12 55276D56 7 MBR F 字符  详情 回复 发表于 2015-2-9 17:50
回复

使用道具 举报

发表于 2015-2-9 17:50:47 | 显示全部楼层
不点 发表于 2015-2-9 17:43
出错信息是 qemu 的主板 BIOS 发出的,不是 grub4dos 发出的。

1、试试 0.4.5,看看是否有相同的问题 ...

1:U盘分区表
磁盘:1
  磁盘信息 磁盘号   大小(字节)         柱面数 磁头数 扇数 扇区 媒体     签名 总线
              1    63786975232           7754    255   63  512   12 55276D56  7 MBR F
  字符说明 激活 __本分区起始__ 分区 __本分区结束__ _______本分区______ ______本分区_______
  激活为0x80    磁头_扇区_柱面 类型 磁头_扇区_柱面 _____起始扇区号____ _____扇区总数______
  主分区1: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  主分区2: 0x00 0xFE 0xFF 0xFF 0x0F 0xFE 0xFF 0xFF 0x69 0xB4 0xE0 0x01 0x54 0xE6 0xC1 0x03
  主分区3: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  主分区4: 0x00 0x00 0x02 0x00 0xFE 0x00 0x02 0x00 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00
  标志   : 0x55 0xAA
  全部分区: -1  @2  -3  1   2   3
  分区  类型 激活(1) 起始(字节)     长度(字节)    隐藏扇区     结尾(字节) 物理# 盘符
    -1  0x00   0              0              0           0              0    1   
    @2  0x0F   0    16129774080    32275998720    31503465    48405772800    2   
    -3  0x00   0              0              0           0              0    3   
     1  0xFE   0            512            512           1           1024    4   
     2  0x0B   0    16129806336    16137967104          63    32267773440    5  G:
     3  0x0B   0    32267805696    16137967104          63    48405772800    6  H:

2:尾部的6M系统不在分区表中(深度隐藏的)

map --in-situ (hd0)XX+YY (hd0)
...
来映射的虚拟磁盘。
回复

使用道具 举报

发表于 2015-2-9 20:23:23 | 显示全部楼层
本帖最后由 不点 于 2015-2-9 20:34 编辑

刚刚想到,你也是开发者,你也可以直接调试。

扩展分区里面的逻辑分区表,如果有毛病,照样有可能引起死机。比如,错误地指向了一个很大的扇区号,造成问题。



补充:确实如你所说,有可能是 qemu 自身 bios 的毛病,比如说,它在读取尾部的扇区时,自己出现了 bug。

你可以试试别的虚拟机,如果别的虚拟机没毛病,那就可以确定是 qemu 的毛病了。






回复

使用道具 举报

发表于 2015-2-9 22:31:13 | 显示全部楼层
2011yaya2007777 发表于 2015-2-8 17:53
已经修正,上传管网。

Well, after many tests, it seems that the MBR/PBR from the latest 0.4.6a versions is buggy.
The MBR is having problems finding GRLDR on partitions with file system type <> NTFS and displaying error messages.
And half of the PBR's are not booting.
In the same testing conditions the MBR/PBR from 0.4.5c and the one from 0.4.6a BOOTICE version are booting ok (except for exFAT ofcourse).

In this situation there is not much I can do but wait for yaya to fix it...
英文我不怎么看的懂,他的意思,0.46a还是有问题吗?
http://reboot.pro/topic/20238-im ... ws-and-linux/page-6
回复

使用道具 举报

发表于 2015-2-10 08:53:32 | 显示全部楼层
这里又有报告0.4.6a的问题的

https://github.com/chenall/grub4dos/issues/37

点评

这个报告依旧显示 try (hd0),没有正常显示分区号。因此 0.4.6 仍然含有逻辑错误。  详情 回复 发表于 2015-2-10 11:52
回复

使用道具 举报

发表于 2015-2-10 09:44:34 | 显示全部楼层
http://reboot.pro/topic/20238-im ... ws-and-linux/page-6
grubinst-gui的中文语言文件还是旧的,不适合这个修改过的新版本了。不知道谁可以更新一下那个语言文件
回复

使用道具 举报

发表于 2015-2-10 11:52:11 | 显示全部楼层
chenall 发表于 2015-2-10 08:53
这里又有报告0.4.6a的问题的

https://github.com/chenall/grub4dos/issues/37

这个报告依旧显示 try (hd0),没有正常显示分区号。因此 0.4.6 仍然含有逻辑错误。
回复

使用道具 举报

 楼主| 发表于 2015-2-10 21:25:12 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2015-2-25 10:25 编辑
这个报告依旧显示 try (hd0),没有正常显示分区号。因此 0.4.6 仍然含有逻辑错误。

点评

你可以贴在报告问题的那个网站上。或者你就直接提交修改后的编译结果,那些高手们都是每天下载最新版测试的,他们很敬业。  详情 回复 发表于 2015-2-11 11:46
回复

使用道具 举报

发表于 2015-2-11 10:11:47 | 显示全部楼层
请问这个现在在哪儿?
---------------------------------------------------------
目前可以使用的函数和变量:
http://grubutils.googlecode.com/svn/trunk/src/include/grub4dos.h
----------------------------------------------------------

点评

应该还在GitHub  详情 回复 发表于 2015-2-11 10:23
回复

使用道具 举报

发表于 2015-2-11 10:23:43 | 显示全部楼层
mdyblog 发表于 2015-2-11 10:11
请问这个现在在哪儿?
---------------------------------------------------------
目前可以使用的函数 ...

应该还在GitHub
回复

使用道具 举报

 楼主| 发表于 2015-2-11 11:14:49 | 显示全部楼层
请教 chenall :
如果在一天内修正 2 个 bug,又不想把补丁混在一起,是否应当这样操作:
1. 同步(更新)补丁代码,保持和主项目代码一致。
   git fetch grub4dos
2. 切换到 0.4.6a
   git checkout grub4dos/0.4.6a -b 0.4.6a
3. 同步(更新)本地库,保持和主项目代码一致
   git rebase grub4dos/0.4.6a
4. 打补丁1
5. 在 commit.log 写提交信息
   .修正 bug1
6. 提交本地修改信息
   git commit -a -F /mnt/cofs/commit.log
7. 上传新的分支
   git push origin 0.4.6a
8. 同步(更新)补丁代码,保持和主项目代码一致。
   git fetch grub4dos
9. 切换到 0.4.6a
   git checkout grub4dos/0.4.6a -b 0.4.6a
10. 同步(更新)本地库,保持和主项目代码一致
   git rebase grub4dos/0.4.6a
11. 打补丁2
5. 在 commit.log 写提交信息
   .修正 bug2
6. 提交本地修改信息
   git commit -a -F /mnt/cofs/commit.log
7. 上传新的分支
   git push
  

点评

1. 同步(更新)补丁代码,保持和主项目代码一致。 git fetch grub4dos 2. 切换到 0.4.6a git checkout grub4dos/0.4.6a -b 0.4.6a 3. 同步(更新)本地库,保持和主项目代码一致 git rebase grub4dos/0.4  详情 回复 发表于 2015-2-11 11:26
回复

使用道具 举报

发表于 2015-2-11 11:26:48 | 显示全部楼层
本帖最后由 chenall 于 2015-2-11 11:29 编辑
2011yaya2007777 发表于 2015-2-11 11:14
请教 chenall :
如果在一天内修正 2 个 bug,又不想把补丁混在一起,是否应当这样操作:
1. 同步(更新) ...


1. 同步(更新)补丁代码,保持和主项目代码一致。
   git fetch grub4dos
2. 切换到 0.4.6a
   git checkout 0.4.6a
3. 同步(更新)本地库,保持和主项目代码一致
   git rebase grub4dos/0.4.6a
4. 打补丁1并提交(只是commit)
git commit
5. 打补丁2同上
git commit
6.打补丁N...同上

7. 确定修改没有问题之后就可以git push

这样子的话所有的补丁都是分开的,但是最终只会自动编译最后一个版本.(每次git push都会生成一个版本的)

同一天有多个补丁,最好还是一起补上,最后再一起push.


回复

使用道具 举报

发表于 2015-2-11 11:46:51 | 显示全部楼层
2011yaya2007777 发表于 2015-2-10 21:25
请测试:attach://209226.7z

你可以贴在报告问题的那个网站上。或者你就直接提交修改后的编译结果,那些高手们都是每天下载最新版测试的,他们很敬业。

回复

使用道具 举报

 楼主| 发表于 2015-2-11 11:54:53 | 显示全部楼层
链接已经贴在报告问题的那个网站上。那个网站不能上传文件。这个链接不需要登录就能下载。
回复

使用道具 举报

发表于 2015-2-11 14:21:15 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-11 16:05 编辑

请问 C写的外置命令中怎
调用
#define builtin_cmd ((int (*)(char *cmd , const char *arg, int flags))((*(int **)0x8300)[44]))
//        .long        ABS(EXT_C(builtin_cmd))  //44

1: flags 怎么填, 统一填0可以吗?

2: cmd需要在 arg 的前部重复吗?

比如要执行【ls (hd0,0)】
builtin_cmd ((char*)"ls", "(hd0,0)",0);
还是
builtin_cmd ((char*)"ls", "ls (hd0,0)",0);


点评

建议看看这些函数的原来的函数的定义。这些函数都是指向内部的某个函数,它们的定义在 asm.S 文件的结尾处。flags 与内部函数的 flags 的意义是一样的,大多数情况下,函数体内部的处理过程都忽略 flags 的值,但也  详情 回复 发表于 2015-2-11 14:40
回复

使用道具 举报

发表于 2015-2-11 14:40:43 | 显示全部楼层
mdyblog 发表于 2015-2-11 14:21
请问 C写的外置命令中怎
调用
#define builtin_cmd ((int (*)(char *cmd , const char *arg, int flags)) ...

建议看看这些函数的原来的函数的定义。这些函数都是指向内部的某个函数,它们的定义在 asm.S 文件的结尾处。flags 与内部函数的 flags 的意义是一样的,大多数情况下,函数体内部的处理过程都忽略 flags 的值,但也有少数例外。

点评

1: builtin_cmd 比较特别, 不是实际要运行的函数, 只是一个“壳”。 在 源代码中兜圈。 所以 来问问。 2: 我文的是2个问题。 山脉只涉及一个。 3: 我需要具体的答案。 比如 【ls (hd0,0)/】 bu  详情 回复 发表于 2015-2-11 15:25
回复

使用道具 举报

发表于 2015-2-11 14:50:58 来自手机 | 显示全部楼层
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=361527
这个里面的问题用不写盘的方法怎么弄?
回复

使用道具 举报

发表于 2015-2-11 15:25:40 | 显示全部楼层
本帖最后由 mdyblog 于 2015-2-11 16:02 编辑
不点 发表于 2015-2-11 14:40
建议看看这些函数的原来的函数的定义。这些函数都是指向内部的某个函数,它们的定义在 asm.S 文件的结尾 ...


1:  builtin_cmd 比较特别, 不是实际要运行的函数, 只是一个“壳”。
在 源代码中兜圈。
所以 来问问。

2: 我问的是2个问题。
上面只涉及一个。


3: 我需要具体的答案。
比如 【ls  (hd0,0)/】
builtin_cmd  怎么写。

不是 一些 “空泛”的指导——那些我懂的。
实际中碰到具体问题, 就希望 “具体” 的答案。

点评

你可以看一下builtin_cmd的源码就明白了.  详情 回复 发表于 2015-2-11 15:48
回复

使用道具 举报

发表于 2015-2-11 15:48:19 | 显示全部楼层
本帖最后由 chenall 于 2015-2-11 15:53 编辑
mdyblog 发表于 2015-2-11 15:25
1:  builtin_cmd 比较特别, 不是实际要运行的函数, 只是一个“壳”。
在 源代码中兜圈。

所以 来问 ...


通过flags可能识别命令运行环境,比如是在菜单中的或者是在命令行的,大部份命令是不管这个flags参数的,但少数有判断,这个不能为0.

外部命令的话参数里面就有一个flags参数是同一个意思,直接用这个flags代入就行了.

其它的你可以看一下builtin_cmd的源码就明白了,不看源码可能无法明白真正的用法.

最简单的就用就是如参数介绍所说的.

很直观的用法. 命令,参数,标志
(char *cmd , const char *arg, int flags)

builtin_cmd('ls','(hd0)',flags);

点评

我现在有个磁盘,他的0扇区有一个隐藏分区(FAT16)的bpb还有一个正常分区的分区表,分区表没有隐藏分区的表项,g4d怎么访问这个隐藏分区?  详情 回复 发表于 2015-2-11 16:33
非常感谢!!  详情 回复 发表于 2015-2-11 15:56
回复

使用道具 举报

发表于 2015-2-11 15:56:42 | 显示全部楼层
chenall 发表于 2015-2-11 15:48
通过flags可能识别命令运行环境,比如是在菜单中的或者是在命令行的,大部份命令是不管这个flags参数的, ...

非常感谢!!
回复

使用道具 举报

发表于 2015-2-11 16:33:18 来自手机 | 显示全部楼层
chenall 发表于 2015-2-11 15:48
通过flags可能识别命令运行环境,比如是在菜单中的或者是在命令行的,大部份命令是不管这个flags参数的, ...

我现在有个磁盘,他的0扇区有一个隐藏分区(FAT16)的bpb还有一个正常分区的分区表,分区表没有隐藏分区的表项,g4d怎么访问这个隐藏分区?

点评

0扇区(即 MBR,换句话说,是最开头的那个扇区)有一个分区的 BPB,以及一个分区表。单看这句话,grub4dos 肯定支持。这里根本不存在隐藏这回事。 比如说,你这个盘是 (hd0),那么,你用 (hd0)/ntldr 即可访问你  详情 回复 发表于 2015-2-11 16:52
回复

使用道具 举报

发表于 2015-2-11 16:52:59 | 显示全部楼层
sunsea 发表于 2015-2-11 16:33
我现在有个磁盘,他的0扇区有一个隐藏分区(FAT16)的bpb还有一个正常分区的分区表,分区表没有隐藏分区 ...

0扇区(即 MBR,换句话说,是最开头的那个扇区)有一个分区的 BPB,以及一个分区表。单看这句话,grub4dos 肯定支持。这里根本不存在隐藏这回事。

比如说,你这个盘是 (hd0),那么,你用 (hd0)/ntldr 即可访问你的 FAT16 的根目录之下的 NTLDR 了。

至于说分区表,照样起作用,利用分区表,你可以访问其他分区,例如 (hd0,0) 之类的。

不需要任何技巧,这些概念属于 grub4dos、文件系统等一系列概念中的基本功。

点评

不给力啊  详情 回复 发表于 2015-2-11 17:05
回复

使用道具 举报

发表于 2015-2-11 17:05:43 来自手机 | 显示全部楼层
不点 发表于 2015-2-11 16:52
0扇区(即 MBR,换句话说,是最开头的那个扇区)有一个分区的 BPB,以及一个分区表。单看这句话,grub4do ...

不给力啊
UC_Photo_001.jpg
回复

使用道具 举报

发表于 2015-2-11 17:16:11 | 显示全部楼层
你的 BPB 肯定有误,无法指向正确的分区位置。下面举例说明可能的错误大致会是什么样的:

位于偏移 0x0E 处的两字节 “保留扇区数” 错误,导致 grub4dos 无法找到该分区的 FAT 表。保留扇区数是 FAT 表之前的扇区数。不可以复制分区引导扇区上的数值,既然现在引导扇区位于 MBR,那么,FAT 表之前的扇区总数就得重新计算,它应该等于第一个 FAT 扇区的扇区号(MBR 的扇区号为 0)。

位于偏移 0x1C 处的四字节 “隐藏扇区数” 错误,导致 grub4dos 无法找到该分区的引导扇区。此时,它应该是 00 00 00 00 才对,因为它位于 MBR。

点评

啊,我知道了,bOOTICE把bpB拷贝错误了,现在知道了,谢谢  详情 回复 发表于 2015-2-11 17:32
回复

使用道具 举报

发表于 2015-2-11 17:32:49 | 显示全部楼层
不点 发表于 2015-2-11 17:16
你的 BPB 肯定有误,无法指向正确的分区位置。下面举例说明可能的错误大致会是什么样的:

位于偏移 0x0E ...

啊,我知道了,bOOTICE把bpB拷贝错误了,现在知道了,谢谢

点评

由于保留扇区数只是一个 2 字节的整数,其最大值也不过只有 65535 而已,因此,你的 FAT 应该是磁盘上的第一个物理分区才行(在物理上靠近磁盘开头),否则,当它靠后时,所需要的保留扇区数很大,超过 65535 个扇区  详情 回复 发表于 2015-2-11 17:51
回复

使用道具 举报

发表于 2015-2-11 17:51:11 | 显示全部楼层
sunsea 发表于 2015-2-11 17:32
啊,我知道了,bOOTICE把bpB拷贝错误了,现在知道了,谢谢

由于保留扇区数只是一个 2 字节的整数,其最大值也不过只有 65535 而已,因此,你的 FAT 应该是磁盘上的第一个物理分区才行(在物理上靠近磁盘开头),否则,当它靠后时,所需要的保留扇区数很大,超过 65535 个扇区,这样就不能用上述简单办法来访问了,需要动用 map --in-situ 或者 partnew 之类的技巧才行。

点评

或者更极端一点,只知道BPB所在扇区  详情 回复 发表于 2015-2-11 18:05
好吧那如果我遇到了这种情况该怎么办(已知该分区的起始扇区和长度)  详情 回复 发表于 2015-2-11 17:54
回复

使用道具 举报

发表于 2015-2-11 17:54:07 | 显示全部楼层
不点 发表于 2015-2-11 17:51
由于保留扇区数只是一个 2 字节的整数,其最大值也不过只有 65535 而已,因此,你的 FAT 应该是磁盘上的 ...

好吧那如果我遇到了这种情况该怎么办(已知该分区的起始扇区和长度)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-10 18:39

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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