无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
跳转到指定楼层
#
发表于 2014-3-19 11:08:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 2011yaya2007777 于 2015-5-17 11:26 编辑

支持含有碎片的文件仿真。最多 32 段碎片。
不加载光驱时,占用 11 Kb 内存。加载光驱时,占用 13 Kb 内存。

同时更该了 usb2.0 驱动设备枚举代码。完善了驱动器号识别。驻留内存精简到 4 Kb。
支持WinXP及后续系统的短文件名大小写。根据短文件名结构偏移0C处:位3=1表示文件名小写,位4=1表示文件扩展名小写。

修正了 udf 格式光盘驱动 bug。

目前已经解决 XP 启动蓝屏,加载 0PE 失败的问题。与 grub4dos 0.4.5c 及旧版 grub4dos 0.4.6a 完全兼容,可以正确地卸载或合并映射插槽。若全部采用新版,则可传递碎片信息。

ntfs 文件系统支持 8Kb 以内的非常驻属性列表。
完善了 iso9600_Joliet 文件格式的识别问题,应对 mkisofs2.01 产生的 bug。

修正了iso9600_Joliet 文件格式转义符显示问题。
增加了更新说明。

支持 16 插槽映射。

ext4 分区支持 64 位功能,支持元块组。
grldr头部、grldr.mbr 支持搜索 gpt 分区的 grldr。
修正了 bootlace,修正了 find。

使用 bootlace.com 安装 grldr.mbr 到 gpt 分区类型的设备。

内置 usb2.0 可以驱动原生4k扇区磁盘。
改进 NTFS 文件系统:
        对于驻留属性文件(小文件),可以写,也可用 blocklist 显示信息。
        对于非驻留属性列表,取消长度限制。

下载地址
http://grub4dos.chenall.net/

加载 usb 驱动失败,反馈失败信息专用 grldr 下载地址
http://wuyou.net/forum.php?mod=attachment&aid=MjExNjY3fDZlYWEwZmE1fDE3MTU2MDE2MjZ8MHw%3D

评分

参与人数 14无忧币 +70 收起 理由
netmjwork + 5 很给力!
2013dqcmjx + 5 很给力!
zhczf + 5 赞一个!
糊涂 + 5 很给力!
2012wuyuvl + 5 很给力!
v5720949 + 5
shan + 5 赞一个!
jdcgzb + 5 很给力!
smine + 5 坚决支持!
xyzxp + 5 就是给力,辛苦了!
yang77 + 5 真的很赞!
阿弥陀佛 + 5 很给力!
3ax31a + 5 很给力!
carbonjiao + 5 很给力!

查看全部评分

推荐
发表于 2014-6-10 11:14:41 | 只看该作者
2011yaya2007777 发表于 2014-6-6 06:40
以前 fsys_ntfs.c 占用内存 3e0000-3e5fff;现在占用 3e0000-3ebfff。
死机的原因应当是加载 G4D 之后,加 ...

小心点,有可能是你多占用的内存所导致的内存冲突。grub4dos 的内存占用比较乱,没有仔细归纳总结,很容易自己就产生冲突。
回复

使用道具 举报

推荐
 楼主| 发表于 2014-6-24 20:39:24 | 只看该作者
onboot.lst 里面就是 git-1.6.tcz 。

另外,在根目录,似乎下载了,但是找不到。
dev@grub4dos_dev:~$  git clone git://gitcafe.com/chenall/grub4dos.git
Initialized empty Git repository in /home/dev/grub4dos/.git/
remote: Counting objects: 2832, done.
remote: Compressing objects: 100% (576/576), done.
remote: Total 2832 (delta 2250), reused 2832 (delta 2250)
Receiving objects: 100% (2832/2832), 2.16 MiB | 334 KiB/s, done.
Resolving deltas: 100% (2250/2250), done.

dev@grub4dos_dev:~$ ls /home/dev/grub4dos/.git/
branches/    description  hooks/       info/        objects/     refs/
config       HEAD         index        logs/        packed-refs

点评

colinux编译环境只有在COFS目录下的文件才可以在WINDOWS中找到,其它的只能在linux下看到. 我这里是正常的,我明天再下载那个开发环境包测试下.  详情 回复 发表于 2014-6-24 23:17
回复

使用道具 举报

推荐
发表于 2017-8-26 16:20:56 | 只看该作者
我感觉,既然 mdyblog 测试 asm.S.new 成功,那就证实了我前面的猜测。于是我们就又摸清楚了 Windows 的一个 “脾气”,即,Windows 不喜欢存在 “长度为 0”的内存块。一旦存在这样的内存块,Windows 就“乱了阵脚”或 “找不到北”了。

当一个内存块被(一个或多个)内存盘占据时,剩余未被占据的部分,如果恰好是 0(也即正好全部被内存盘占满),这是旧版本的 grub4dos 处理不好(无法处理)的情况。旧版本的 grub4dos 用 int15 来返回 0 的可用内存块长度给 int15 的调用者(比如操作系统)。Windows 遇上这个 0 长度的内存块,彻底乱套,拒绝继续启动。

我的解决办法是:当这种情况发生时,不修改这个可用内存块(usable RAM)的长度,即,保持这个内存块长度不变,而把它的 type(类型) 从 “usable RAM(用户可用)”更改成 “reserved(系统保留,用户不可用)”。这就完美解决了。

错误的技术根源猜测。我猜 Windows
(有可能)把长度为 0 的内存块当成长度为 4G(=2 的 32 次方) 来处理了,也有可能是当作 2 的 64 次方来处理了,于是就全乱了。大家很熟悉:在二进制表示中,负1(即 “-1”) 与最大的数是相同的,而“最大的数”再加上 1,就等于 0。所以,在 long 整数(即 32 位整数)中,0 和 4G 是一样的(4G 就是 2 的 32 次方)。在 long long 整数(即 64 位整数)中,0 就等于 2 的 64 次方(可以粗略理解为 “无限大”)。

换句话说,Windows 的实模式启动代码把长度为 0 的内存块(有可能)当成长度为“无限大”来处理了。那么,由于 Windows 认为整个内存全部被(这个内存块)占用,完全没有可用内存了。于是,Windows 就认为内存不够了。因此,它就要报错,并且拒绝继续启动 Windows 的内核。


回复

使用道具 举报

推荐
发表于 2015-2-17 14:54:00 | 只看该作者
sunsea 发表于 2015-2-17 13:10
我就是找了一个移动硬盘,往里面部署multimbr(32G),0PE,一堆合盘和一个USBXP,占了10G多,然后故意 ...

1: 你是说,没加 usb --init 就不能正常启动, 加了就能正常启动,是吗?


2:移动硬盘本身是支持LBA的。也就是说硬件接口本身有这个能力。
你这里 是“认”成fdd 0x00, 从用CHS访问。
但是 usb --init ,会不会有把它变回hdd,从而能用硬件的LBA接口。

现在,怎确认是 用的硬件本身的LBA访问接口,还是usb -init直接通过 sici总线命令、U盘协议直接访问?

看来还得问问C大了。



点评

这件事问yaya更好,这个功能是他写的  发表于 2015-2-17 17:36
1:是的 2:所有USB存储设备内部寻址都是LBA,其他我不知道  详情 回复 发表于 2015-2-17 17:34
回复

使用道具 举报

推荐
发表于 2015-2-28 11:29:36 | 只看该作者
本帖最后由 mdyblog 于 2015-2-28 15:43 编辑

反应个现象,不知算不算BUG。
如果对U盘启动的ud 执行 geometry --lba1sector
后面读盘就死翘翘了。
先确认hd启动,不是fd。

  1. geometry --lba1sector (128)
  2. dd  if=(128)0+1  of=(md)0x200+1
复制代码

就死翘翘了。


没有geometry --lba1sector
  1. dd  if=(128)0+1  of=(md)0x200+1
复制代码

就没问题。


Ver: grub4dos-0.4.6a-2015-01-18.7z

实例fba: 2015-0118.fba.zip (165.92 KB, 下载次数: 14)

qemu  模拟器中没问题。
实际U盘,在我的新旧2台机器上都是  死翘翘 。--------------急
回复

使用道具 举报

推荐
发表于 2015-2-27 09:01:51 | 只看该作者
mdyblog 发表于 2015-2-27 07:28
>>假如能够把这个问题做好,达到两全其美,那也是好事。
-------------------
我分析了下。 应该可以 ...


随便说说一点看法,供参考。

你可以自己打补丁,提交给 chenall。chenall 接到补丁后,可以先测试一段时间,如果放心,就会正式采纳。chenall 甚至也有可能为你单独开辟一个系列,就像以前为 yaya 单独开辟一个系列那样,进行长期的测试和评估。一旦成熟,大家自然会全面采用你的版本。

如果你自己不愿意做或者没时间做,可以等待别人去做。可以说服开发团队成员去按照你的思路完成任务。如果开发团队成员由于种种原因做不了,那你可以在团队之外寻求高手支持,完成开发任务。

回复

使用道具 举报

推荐
发表于 2015-2-25 20:40:17 | 只看该作者
从 ud 盘启动时,ud 可以访问。如果转而启动另一个 grldr,则已经不是从 ud 盘启动了,而是相当于从 bios 直接启动了某个引导扇区,不是从 ud 启动,也不是从光盘启动,此时 ud 是不能访问的。

解决办法:不要在 grub 环境又启动一个新的 grub 环境,丧失原来的 ud 访问能力。

点评

1) 我要的不是原因,也不是原理,也不是“理念”。 而是适用的解决方案。 2) 解决办法:不要在 grub 环境又启动一个新的 grub 环境,丧失原来的 ud 访问能力。 这个是无法保证的。 MBROSTool格式化的 UD盘,  详情 回复 发表于 2015-2-25 21:22
回复

使用道具 举报

推荐
发表于 2014-7-26 19:16:49 | 只看该作者
估计是你搞错了,造成莫名其妙的错觉。

你可以看看 asm.S 开头的那些变量,尤其是 install_partition 和 boot_drive 变量。

传入的 DL 的值会被 0000:8200 处的代码自动存入到 boot_drive 变量中。

但 DH 值不会被自动存入 install_partition 的位 16 - 位 24 的字节上,你必须在传递控制之前修改好,即,你需要自己把 DH 的值存入 install_partition 的位 16 - 位 24 的字节上,然后再把控制转移到 0000:8200 处的代码。

同时,如果 0000:7C00 处含有合法的 BPB 引导扇区,则 grub4dos 有可能会利用这个 BPB 表来确定启动盘的信息。

就是说,在传递控制之前,如果能保证 0000:7C00 处含有某个主分区的引导扇区(或者碰巧是这样),则这个主分区就可能被 grub4dos 当作 boot 设备(以及当前 root 设备)。



点评

你是说这些变量需要初始化,是吗? 0000:8208 4字节(即双字) 启动分区号 install_partition (the boot partition) 0000:8280 4字节(即双字) 启动驱动器号(boot_drive) 0000:829C 4字节(即双字) 当前  详情 回复 发表于 2014-8-22 18:05
回复

使用道具 举报

推荐
发表于 2014-7-11 10:35:02 | 只看该作者
2011yaya2007777 发表于 2014-7-11 10:26
还想问一下,执行同步(更新)代码功能,保持和主项目代码一致。
        cd grub4dos
        git fetch grub4dos

这个同步只是更新了本地库.

你还需要再git push推送一下https://github.com/yaya2007才会更新.

点评

新版在XP下不能编译了,grub4dos_dev_2014-06-25 + grub4dos-0.4.5c-2014-07-11源码 不管 grub4dos 放在colinux/还是grub4dos_dev/g4d_dev/home/dev/都报错  详情 回复 发表于 2014-7-16 09:53
回复

使用道具 举报

推荐
 楼主| 发表于 2014-7-11 10:26:28 | 只看该作者
还想问一下,执行同步(更新)代码功能,保持和主项目代码一致。
        cd grub4dos
        git fetch grub4dos
        git rebase grub4dos/0.4.6
后,是更新了我在https://github.com/yaya2007的分支库,还是更新了本地grub4dos源文件,还是2者都更新了?

哦,看到本地grub4dos源文件更新了,似乎https://github.com/yaya2007没有更新。

点评

这个同步只是更新了本地库. 你还需要再git push推送一下https://github.com/yaya2007才会更新.  详情 回复 发表于 2014-7-11 10:35
回复

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

点评

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

使用道具 举报

1182#
发表于 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能仿真成功并启动系统?
回复

使用道具 举报

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

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

使用道具 举报

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

点评

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

使用道具 举报

1179#
发表于 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。
回复

使用道具 举报

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


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

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

使用道具 举报

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

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

使用道具 举报

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

点评

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

使用道具 举报

1175#
发表于 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驱动器号。
非常感谢!!!!!!
我来测试下。
回复

使用道具 举报

1174#
 楼主| 发表于 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
回复

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

1170#
发表于 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
回复

使用道具 举报

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

点评

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

1166#
发表于 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
回复

使用道具 举报

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

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


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

使用道具 举报

1164#
发表于 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
回复

使用道具 举报

1163#
发表于 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
这样 就能访问该分区了。
回复

使用道具 举报

1162#
发表于 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
回复

使用道具 举报

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

使用道具 举报

1160#
发表于 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
回复

使用道具 举报

1159#
发表于 2017-9-18 18:44:47 | 只看该作者
本帖最后由 mdyblog 于 2017-9-18 18:59 编辑

不点 发表于 2017-9-18 17:28
首先,注意 --in-situ 的含义:它只是把分区表虚拟化,别的保持不动。

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


你应该直接使用

map --in-situ (hd0)0x80+0x1000 (hd2)
----------------------
显示中, 这两步是没关联的。这里只是演示下。
第一步可能是另外一个grldr 传过来的。(同样可能 第2步后又启动第3个grldr)


map --in-situ (hd0)0x1080+0x1000 (hd0)
时,我不知道  (hd0) 怎么来的。
我需要为后续的系统菜单创建一个虚拟的(hd0),作为他的磁盘。

同时原(hd0)要 备份到 (hd2)这个名目下,后续可能需要里面的文件。

怎样方便实现这个目的。 我想很多人需要这个吧。

嵌套--in-situ, 这是另外一个问题了。

这样2个问题(假定(hd0)是另外一个同版本grldr的另外一个作者的菜单传过来的):
(1) 在独立的第2步中, 如何方便 原(hd0) 备份到 (hd2)这个名目下。
(2) 在独立的第2步中, 如何方便 map --in-situ ,以避免 嵌套--in-situ。

能加强map功能吗?增加新的开关也可以接受。智能处理也能接受。

备份是否扩成成:
map --move (hd0)  (hd2)
--move 告诉map, 如果是虚拟的, 直接移到 (hd2)上

避免 嵌套--in-situ。是否扩成成:
map --in-situ --exp  (hd0)0x1080+0x1000  (hd0)
--exp 告诉map, 避免 嵌套--in-situ。 map应该用相关信息。


因此,你那种 “备份” 的想法,感觉就有点 “奇葩” 了。
------------------------
这只是一种说法。不必较真。
现实中需要这种应用。
不知道(hd0)怎么来的。 有需要重新虚拟一个(hd0)用。但是有需要保留原(hd0)的访问能力。

回复

使用道具 举报

1158#
发表于 2017-9-18 17:28:53 | 只看该作者
首先,注意 --in-situ 的含义:它只是把分区表虚拟化,别的保持不动。

它只是把——比如说,从偏移扇序号 80h 开始的 1000h 个扇区——虚拟为主分区。也就是说,让主分区表的某一项(如果有空位的话)指向这个位置(起始地址和长度)。

特别注意,虚拟磁盘的其他扇区都是 “实在” 的,未进行虚拟化。这一点很重要,不要在理解上有偏差。

因此,你那种 “备份” 的想法,感觉就有点 “奇葩” 了。本来 --in-situ 就是一个指针而已,根本没有什么东西需要备份。如果 “非要备份不可” 的话,那也是备份这个指针,即备份 80h 和 1000h 这两个数字(即,虚拟主分区的起始扇区号和虚拟主分区的长度)。

假如你希望达到这样的目的:

Fr To Hm Sm To_C _H _S   Start_Sector     Sector_Count   DHR
-- -- -- -- ---- -- -- ---------------- ---------------- ---
82 80 FE 01 000E FE FF 0000000000000080 0000000000001000 H=S

你应该直接使用

map --in-situ (hd0)0x80+0x1000 (hd2)

嵌套的 --in-situ,容易出问题。我是说,我在编程的时候,就有可能出现 bug 之类的(即,没有处理好的情况)。如果你发现了 bug,你可以让 chenall、yaya 解决。我发现,chenall、yaya 都解决过以前我没处理好的一些问题,而且都解决得很漂亮。

但最好别让 chenall、yaya 他们太过于忙碌——我认为,能不做就不要做;能躲过,就尽量躲过。因为万一改动坏了,不是还得折腾吗。这年月(BIOS 逐步被抛弃),grub4dos 也不值得再投入太大的精力了——我认为。

因此,建议尽量避免嵌套使用 --in-situ。否则,你让开发者修复 bug,这恐怕有工作量吧?


点评

建议尽量避免嵌套使用 --in-situ。 ---------------------- 将一个没有分区表的磁盘片(相当于1个分区IMG), 虚拟成一个磁盘。 好像只能 用 --in-situ。 还有其它的方式吗?  详情 回复 发表于 2017-9-18 19:02
你应该直接使用 map --in-situ (hd0)0x80+0x1000 (hd2) ---------------------- 显示中, 这两步是没关联的。这里只是演示下。 第一步可能是另外一个grldr 传过来的。 map --in-situ (hd0)0x1080+0x1000  详情 回复 发表于 2017-9-18 18:44
回复

使用道具 举报

1157#
发表于 2017-9-18 16:51:39 | 只看该作者
请稍等,容我先慢慢理解一下你的意思,然后再回复。
回复

使用道具 举报

1156#
发表于 2017-9-18 15:43:12 | 只看该作者
本帖最后由 mdyblog 于 2017-9-18 18:39 编辑

反应个现象。 不知道是否算问题。
关于 map --in-situ 的。
map --in-situ (hd0)0x80+0x1000 (hd0) && map (hd0) (hd1) &&  map --hook
floppies_orig=0, harddrives_orig=1, floppies_curr=0, harddrives_curr=2

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

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到 (hd0)
于是 虚拟 (hd0) “备份到” (hd2) 这个名目下。
map --in-situ (hd0)0x1080+0x1000 (hd0) && map (hd0) (hd2) &&  map --hook
或者:map --in-situ (hd1)0x1080+0x1000 (hd0) && map (hd0) (hd2) &&  map --hook

但是备份出来的(hd2) 不是 要备份的前面的虚拟(hd0),而是原始的(hd0),偏移和长度信息都没了。

floppies_orig=0, harddrives_orig=1, floppies_curr=0, harddrives_curr=3

Number of ATAPI CD-ROMs: 0

ram_drive=0x7F, rd_base=0x0, rd_size=0x100000000

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
82 80 00 01 8010 FE 41 0000000000000000 0000000000000000 H=S
注意红色的部分:虚拟盘 偏移和长度信息 变了。

这样就无法访问原来虚拟的(hd0,0)里面的文件了。

怎样方便地备份前面的虚拟 (hd0)到(hd2),后面还要访问里面的信息。

测试VHD。 加载VHD后,用finsbtool  MBT Qemu启动测试器 VMware 模拟启动,即可复现显现。
V10M.VHD.rar (179.24 KB, 下载次数: 5)

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-13 20:00

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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