无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
1171#
发表于 2017-9-18 19:02:05 | 只看该作者
不点 发表于 2017-9-18 17:28
首先,注意 --in-situ 的含义:它只是把分区表虚拟化,别的保持不动。

它只是把——比如说,从偏移扇序 ...


建议尽量避免嵌套使用 --in-situ。
----------------------
将一个没有分区表的磁盘片(相当于1个分区IMG), 虚拟成一个硬盘。
好像只能 用 --in-situ。 还有其它的方式吗?

点评

你说的其实就是将软盘虚拟为硬盘。举例: map --mem (...)/.../floppy.img (hd0) 当 grub4dos 发现你的 IMG 不含 MBR 分区表、同时也在使用 --mem 参数的时候,grub4dos 会自动在内存中为这个 IMG 添加一个分  详情 回复 发表于 2017-9-18 21:07
回复

使用道具 举报

1172#
发表于 2017-9-18 19:44:21 | 只看该作者
抱歉,我还是不太理解你的处境。请容我再仔细研究一下你的帖子,然后再试试回复。
回复

使用道具 举报

1173#
发表于 2017-9-18 20:21:08 | 只看该作者
你可能是在 “超限使用 grub4dos”,——不知我这么理解,是否恰当。

--in-situ 的“作用”,或者说“目的”,就是把一个硬盘上的连续扇区序列虚拟成一个主分区。用户最常用的情景,可能是把一个逻辑分区虚拟为主分区。

如果 --in-situ 完成了(或者说“达到”了)这样的目的,那么,--in-situ 就没有错误。


--in-situ 虚拟技术的实现细节是这样的:

当应用程序试图去访问虚拟硬盘的时候,应用程序所看到的是一个虚拟的(通俗地说,就是“假”的)分区表。这个虚拟分区表上有四个表项。其中有一项正是用户所关心的“(虚拟的、假的)主分区”。

抱歉,我没能理解你的描述。我真不知道,--in-situ 还能用来干别的事。你似乎就是在用 --in-situ 来干别的事。

我绝不是说不可以这么做。你能这么做,肯定是好事。但问题在于,我不了解你的处境,理解不了你的操作过程,以及问题关键点在什么地方,没法帮你。

假如你能通俗地为我(或者为网友们)解释清楚你的应用场景(或应用的方法),你可以详细解释一下。否则,我们不在一个轨道上,互相没法交流。

假如我不理解你的操作过程或某些关键的细节,我肯定没法回复。

点评

抱歉,我没能理解你的描述。我真不知道,--in-situ 还能用来干别的事。你似乎就是在用 --in-situ 来干别的事。 --------------------- 如果说只是 启动个 逻辑分区, 那么目标也太低了。 现在这么用的场景真的很  详情 回复 发表于 2017-9-18 20:28
回复

使用道具 举报

1174#
发表于 2017-9-18 20:28:15 | 只看该作者
不点 发表于 2017-9-18 20:21
你可能是在 “超限使用 grub4dos”,——不知我这么理解,是否恰当。

--in-situ 的“作用”,或者说“目 ...


抱歉,我没能理解你的描述。我真不知道,--in-situ 还能用来干别的事。你似乎就是在用 --in-situ 来干别的事。
---------------------
如果说只是 启动个 逻辑分区, 那么目标也太低了。
现在这么用的场景真的很少。
现在是这样的, 先将几个分区IMG写道磁盘上某处 (hd0)0x80+0x1000 和 (hd0)0x1080+0x1000
这些都不在逻辑分区中。

要启动  (hd0)0x80+0x1000  分区IMG。
map --in-situ  (hd0)0x80+0x1000  (hd0) && map  (hd0)  (hd1)  && map --hook
这样 就能访问该分区了。


接着要访问分区IMG  (hd0)0x1080+0x1000
map --in-situ  (hd0)0x80+0x1000  (hd0) && map  (hd0)  (hd2)  && map --hook
这样 就能访问该分区了。
回复

使用道具 举报

1175#
发表于 2017-9-18 21:07:56 | 只看该作者
mdyblog 发表于 2017-9-18 19:02
建议尽量避免嵌套使用 --in-situ。
----------------------
将一个没有分区表的磁盘片(相当于1个分 ...

你说的其实就是将软盘虚拟为硬盘。举例:

map --mem (...)/.../floppy.img  (hd0)

当 grub4dos 发现你的 IMG 不含 MBR 分区表、同时也在使用 --mem 参数的时候,grub4dos 会自动在内存中为这个 IMG 添加一个分区表。

其实,我这个回复是多余的。因为你肯定知道这个情况。


下面继续讨论相关话题。

如果没有 --mem,那么目前的 grub4dos 还不具有“自动为 IMG 添加虚拟分区表”功能。

--in-situ 不是为 IMG 添加分区表。--in-situ 其实是在对整个硬盘进行虚拟化。它不是仅仅对某个 IMG 的一个连续扇区序列进行虚拟化。--in-situ 把硬盘的分区表给“更改”了(“虚拟化”了),通常是添加了一个表项(比如通常是 hd0,0),让它指向用户所关心的 IMG (或任意一个连续扇区序列)。注意,这里的概念不要弄错。用户虽然只关心 IMG 的虚拟,但整个硬盘都被虚拟了。在虚拟的硬盘上,用户通常除了能够看得见虚拟的 (hd0,0) 之外,还能看见其他真实分区,比如 (hd0,4), (hd0,5),等等。这些分区都是虚拟硬盘 (hd0) 中的一部分。不要以为,经过 --in-situ 虚拟化了的 (hd0) 上只有一个分区(即与 IMG 所对应的那个分区)。经过 --in-situ 虚拟化以后,虚拟硬盘上的分区,比真实硬盘还多了一个分区(多出的这个分区就是 IMG 所对应的那个分区)。真实硬盘上原来有的分区(不管是逻辑分区还是主分区),在虚拟硬盘上也都存在,一个都不少(但其分区编号可能与对应的真实硬盘有所不同)。

另外,grub4dos 确实有一个功能,就是,把一个逻辑分区虚拟成一个含有分区表的硬盘。这种功能比 --in-situ 实现得还要早。也就是说,--in-situ 是后来才开发出来的。

注意,是把逻辑分区虚拟成硬盘,不是把普通扇区序列(比如不含分区表的 IMG 文件)虚拟成硬盘。由于这不是你关心的情况(你关心的是对 IMG 的虚拟,不是对逻辑分区的虚拟),我也就不再详述了。readme 文件里面好像提到过这种功能吧。这一点,我猜你可能早都知道了。但这个功能,似乎很少有人用。


点评

能添加我说的功能吗?  详情 回复 发表于 2017-9-18 22:01
回复

使用道具 举报

1176#
发表于 2017-9-18 22:01:22 | 只看该作者
不点 发表于 2017-9-18 21:07
你说的其实就是将软盘虚拟为硬盘。举例:

map --mem (...)/.../floppy.img  (hd0)


那么,能添加我说的功能吗?
回复

使用道具 举报

1177#
发表于 2017-9-18 23:11:12 | 只看该作者
明白了。mdyblog 是想给已经 --in-situ (并且已经 --hook )了的盘映射出一个新的盘号。结果,新盘丢失了 --in-situ 特有的信息(起始扇区号,扇区总长度,以及映射参数)。此时,出现的 bug 是,map (hd0) (hd2) 执行时未能认出 hd0 是一个具有 --in-situ 映射参数的虚拟盘,结果,导致 hd2 克隆了普通硬盘 hd0,而不是克隆经过 --in-situ 虚拟后的硬盘 hd0。

yaya 看看能否修复。我可有点累,忙不过来。如果 yaya 能做的话,那就做吧。不怕弄坏,弄坏了还可以恢复。如果没有时间,那就等着以后有时间再弄。磁盘仿真程序虽然最初是我写的,但是,现在我觉得,看代码都累,而且,我还不一定能看懂以前我自己写的代码。所以,即使让我来修复,也不一定比 yaya 更轻松一些。chenall 也可以,只是觉得,chenall 来这儿的时间都不太多,估计和我有点类似,忙不过来。

点评

对!!!!!!就是这个意思。 对应地, 还有 --in-place  详情 回复 发表于 2017-9-19 04:18
回复

使用道具 举报

1178#
发表于 2017-9-19 04:18:58 | 只看该作者
不点 发表于 2017-9-18 23:11
明白了。mdyblog 是想给已经 --in-situ (并且已经 --hook )了的盘映射出一个新的盘号。结果,新盘丢失了  ...

对!!!!!!就是这个意思。
对应地, 还有 --in-place
回复

使用道具 举报

1179#
 楼主| 发表于 2017-9-19 07:25:07 来自手机 | 只看该作者
map --in-situ (hd0)0x1080+0x1000 (hd2)  不是就不用  msp (hd0) (hd3)  了。也就不会导致 hd2 克隆了普通硬盘 hd0,而不是克隆经过 --in-situ 虚拟后的硬盘 hd0。
回复

使用道具 举报

1180#
 楼主| 发表于 2017-9-19 07:26:41 来自手机 | 只看该作者
是hd2,不是hd3.

点评

这个BUG的修复有下文了吗?  详情 回复 发表于 2017-9-29 15:08
回复

使用道具 举报

1181#
发表于 2017-9-19 07:43:01 | 只看该作者
问题是,hd0 是先前某个 grldr 所建立的虚拟盘。他只知道 hd0 是虚拟盘,不知道 hd0 的映射参数(起始扇区、扇区总数等信息),因此他没法用 map --in-situ (hd0)0x1080+0x1000 (hd2) 。再一个,他也是想使用起来简单方便罢了。所以,他想让 grub4dos 能够自动处理这种含有 --in-situ 的嵌套映射问题。本质上属于嵌套,如果没有嵌套,一切都正常。而 mdyblog 正是希望嵌套使用磁盘虚拟功能。

我都费了好大劲才了解了 mdyblog 的意思。这确实属于 grub4dos 在处理含有 --in-situ 的嵌套映射时的 bug。你再慢慢琢磨琢磨。

点评

对!!!!就是这个场景!!!!!!!!!!!!  详情 回复 发表于 2017-9-19 09:39
回复

使用道具 举报

1182#
发表于 2017-9-19 09:39:39 | 只看该作者
不点 发表于 2017-9-19 07:43
问题是,hd0 是先前某个 grldr 所建立的虚拟盘。他只知道 hd0 是虚拟盘,不知道 hd0 的映射参数(起始扇区 ...

对!!!!就是这个场景!!!!!!!!!!!!
回复

使用道具 举报

1183#
发表于 2017-9-29 15:08:59 | 只看该作者

这个BUG的修复有下文了吗?
回复

使用道具 举报

1184#
 楼主| 发表于 2017-9-29 15:44:09 | 只看该作者
没有顾上。得潜下心来研究一下代码,很迷惑。
回复

使用道具 举报

1185#
 楼主| 发表于 2017-10-5 12:01:17 | 只看该作者
执行
map --in-situ (hd0)0x80+0x1000 (hd0)
map (hd0) (hd1)
map --hook
之后,已经有了form驱动器0x80
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
80 80 FE 01 000E FE FF 0000000000000080 0000000000001000 H=S
81 80 00 01 8001 FE 7F 0000000000000000 0000000000000000 H=S

再执行
map --in-situ (hd0)0x1080+0x1000 (hd0)
之后,插槽有2个form驱动器是0x80
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
80 80 FE 01 000E FE FF 0000000000000080 0000000000001000 H>S
81 80 00 01 8001 FE 7F 0000000000000000 0000000000000000 H=S
80 80 FE 01 000E FE C1 0000000000001080 0000000000001000 H<S

再执行
map --hook
之后,新form驱动器会替代旧form驱动器,只允许1个0x80.
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
80 80 FE 01 000E FE C1 0000000000001080 0000000000001000 H=S
81 80 00 01 8001 FE 7F 0000000000000000 0000000000000000 H=S

此时,第一次创建的0x80驱动器“(hd0)128+4096 (hd0)”已经不存在,不可能备份到(hd2)。
这不是--in-situ的错误,也不是G4D的错误,规则就是以旧换新。

可以这样:
map --in-situ (hd0)0x1080+0x1000 (hd2)
map --swap-drive=(hd0)=(hd2)
map --hook
Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
80 80 FE 01 000E FE FF 0000000000000080 0000000000001000 H=S
81 80 00 01 8001 FE 7F 0000000000000000 0000000000000000 H=S
82 80 FE 01 000E FE C1 0000000000001080 0000000000001000 H=S

--swap-drive 是新参数,交换2个form驱动器号。

grub4dos-0.4.6a-2017-10-05.7z.rar

289.72 KB, 下载次数: 7

点评

测试成功!!!!! 再次感谢!!!!!!!!!!!!!!  详情 回复 发表于 2017-10-5 16:17
--swap-drive 是新参数,交换2个form驱动器号。 非常感谢!!!!!! 我来测试下。  详情 回复 发表于 2017-10-5 12:48
回复

使用道具 举报

1186#
发表于 2017-10-5 12:48:42 | 只看该作者
2011yaya2007777 发表于 2017-10-5 12:01
执行
map --in-situ (hd0)0x80+0x1000 (hd0)
map (hd0) (hd1)

--swap-drive 是新参数,交换2个form驱动器号。
非常感谢!!!!!!
我来测试下。
回复

使用道具 举报

1187#
 楼主| 发表于 2017-10-5 16:02:49 来自手机 | 只看该作者
其实,不使用  --in-situ 参数,照样可以成功。就是说,软盘镜像可以映射为没有分区表的硬盘。

点评

两种途径吧。 一种硬盘模式, 一种软盘模式。 硬盘模式 兼容性好些。 有些软件不能再软盘运行。  详情 回复 发表于 2017-10-5 16:18
回复

使用道具 举报

1188#
发表于 2017-10-5 16:17:09 | 只看该作者
2011yaya2007777 发表于 2017-10-5 12:01
执行
map --in-situ (hd0)0x80+0x1000 (hd0)
map (hd0) (hd1)

测试成功!!!!!
再次感谢!!!!!!!!!!!!!!
回复

使用道具 举报

1189#
发表于 2017-10-5 16:18:24 | 只看该作者
2011yaya2007777 发表于 2017-10-5 16:02
其实,不使用  --in-situ 参数,照样可以成功。就是说,软盘镜像可以映射为没有分区表的硬盘。


两种途径吧。
一种硬盘模式, 一种软盘模式。

硬盘模式 兼容性好些。 有些软件不能在软盘运行。
回复

使用道具 举报

1190#
发表于 2017-11-12 11:53:49 | 只看该作者
10-23的源码的makefile(am/in)有点奇怪

        $(AM_V_at)dd if=bootlace.com of=grldr.pbr bs=512 skip=57 count=10             #skip(1):  "EB 58 90 00" position in the bootlace.com                redress: skip +(-) 1
        $(AM_V_at)dd if=bootlace.com of=grldr_cd.bin bs=512 skip=67 count=1           #skip(2):   = skip(1) + 10
        $(AM_V_at)dd if=bootlace.com of=grldr.pbr bs=512 skip=68 seek=10 count=1      #skip(3):   = skip(2) + 1

1、3行输出的文件都是 grldr.pbr。
回复

使用道具 举报

1191#
 楼主| 发表于 2017-11-12 14:56:27 来自手机 | 只看该作者
看看grldr.pbr就知道了。增加了udf格式磁盘的引导代码。

点评

哦, 明白了, 就是1个文件。  详情 回复 发表于 2017-11-12 15:00
回复

使用道具 举报

1192#
发表于 2017-11-12 15:00:33 | 只看该作者
2011yaya2007777 发表于 2017-11-12 14:56
看看grldr.pbr就知道了。增加了udf格式磁盘的引导代码。

哦, 明白了, 就是1个文件。
回复

使用道具 举报

1193#
发表于 2018-2-1 13:58:58 | 只看该作者
grub4支持碎片仿真,也就是说我创建一个xpvhd,然后再创建差分xpvhd,我用
title Microsoft Windows XP
find --set-root /grub/images/winxp.vhd
map /grub/images/winxp.vhd (hd0)
map (hd0) (hd1)
map --hook
root (hd0,0)
chainloader /ntldr
仿真差分xpvhd,差分xpvhd能仿真成功并启动系统?
回复

使用道具 举报

1194#
 楼主| 发表于 2018-2-1 17:00:11 | 只看该作者
碎片和差分不是一回事。好像vhd支持动态,不支持差分。具体你试一试就知道了。

点评

实际上追加的补丁是支持的map -mem加载动态VHD RAMOS用的吧 我是完全用不到  详情 回复 发表于 2018-2-2 18:49
回复

使用道具 举报

1195#
发表于 2018-2-2 18:49:30 | 只看该作者
2011yaya2007777 发表于 2018-2-1 17:00
碎片和差分不是一回事。好像vhd支持动态,不支持差分。具体你试一试就知道了。

实际上追加的补丁是支持的map -mem加载动态VHD
RAMOS用的吧
我是完全用不到
回复

使用道具 举报

1196#
发表于 2020-2-1 12:26:07 来自手机 | 只看该作者
很值得参考的文章。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-26 09:37

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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