无忧启动论坛

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

[求助] 关于--in-situ

[复制链接]
跳转到指定楼层
1#
发表于 2012-11-9 21:35:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
--in-situ 的映射不会改变真实的分区表,那仿真的分区表在内存里吗?如果在内存,可以修改吗?
请路过的大大给予解答
2#
发表于 2012-11-10 17:46:19 | 只看该作者
是用仿真代码来虚拟分区表的。内存中只有仿真程序代码,没有分区表的备份。既然是代码实现的,你是无法修改的(除非你更改程序代码)。

你可以用 cat --hex (hd0)+1 来访问 MBR 以及分区表。这里的 (hd0) 假定就是你用 --in-situ 虚拟出来的硬盘。
回复

使用道具 举报

3#
 楼主| 发表于 2012-11-10 20:23:13 | 只看该作者

回复 #2 不点 的帖子

先谢过不点大!看了一下,原来分区1的信息被移到了最后,虚拟的分区信息放到了分区1的位置。
我想要的是只需要将虚拟的分区信息放置在分区1位置,其它分区信息清零。要是能用dd命令写入就灵活了!
回复

使用道具 举报

4#
发表于 2012-11-11 21:50:37 | 只看该作者
把其他分区信息清除掉,有什么实际用途吗?如果没有用处,那还是留着好。

如果你的理由充足,那么我们可以添加一个开关,让虚拟的分区表只有一个分区。
回复

使用道具 举报

5#
 楼主| 发表于 2012-11-11 22:43:29 | 只看该作者

回复 #4 不点 的帖子

我的用途比较特别,用于win7系统将差分vhd放入primo内存盘。
分区2上放入子母vhd,使用分区2来启动,但需要修改分区表,让系统"以为"是分区1启动。启动后的系统将通过分区1上junction目录从内存盘上读写子vhd文件。
目前采用的方法是在分区2之前63个扇区处写入修改的mbr(将分区2信息植入到分区1处,其余分区信息清零),然后使用map命令:map (hd0)406455777+61462800 (hd0)
具体看我的qq空间,http://user.qzone.qq.com/1543764927/blog/1351430770
回复

使用道具 举报

6#
发表于 2012-11-12 11:24:50 | 只看该作者
你没有阐述清楚,其他分区项目的存在,如何影响你的正常使用了?为何只能保留一个分区,而不能有其他分区的存在。

有时候,你需要的不是 map --in-situ , 而是 partnew 命令执行真实的修改分区表的动作。
回复

使用道具 举报

7#
 楼主| 发表于 2012-11-12 11:40:21 | 只看该作者

回复 #6 不点 的帖子

首先我并不想永久的修改区表,因为进入系统以后所有的分区都应该能显现。
我的目的只是启动的时候map一个分区为硬盘,同时屏蔽掉原来的硬盘。
由于map分区需要分区表,因此想借助--in-situ参数,临时修改一下分区表,但需要屏蔽其他的分区,只有这样做才能够让启动后的系统通过分区1上junction目录链接读写内存盘上的子vhd文件。否则系统启动后仍使用启动分区中的子vhd文件。具体原理我不清楚,但实践的结果就是这样。

[ 本帖最后由 2012wuzhong 于 2012-11-12 12:13 编辑 ]
回复

使用道具 举报

8#
发表于 2012-11-12 12:10:35 | 只看该作者
map --in-situ 只是用某种逻辑(即算法)修改了分区表,显然,逻辑(算法)本身不是唯一的,可以有无穷多种。

所以,如果要实现不同的逻辑(算法),那也有无穷多种实现。

针对你这个要求,我在想,也许将来能够把硬盘上的某个扇区直接作为 --in-situ 所使用的 MBR,或者在内存中保存这份虚拟的 MBR。如此,也许就可以应付大多数需要了。
回复

使用道具 举报

9#
 楼主| 发表于 2012-11-12 12:15:27 | 只看该作者

回复 #8 不点 的帖子

是的,正是这样。不知道实现起来是不是很麻烦?
回复

使用道具 举报

10#
发表于 2012-11-12 15:43:00 | 只看该作者
title primo w7636.vhd
map (hd0) (hd1)
map (hd0)406455777+61462800 (hd0)   //这个就是(hd0,4)吧?如逻辑第一分区
map --hook
dd if=(hd1,0)/hd_mbr.BIN of=(hd0)
chainloader (hd0,0)/bootmgr
---------------------------------------
改成下面试试:

title primo w7636.vhd
map --mem=0x20000  (hd0,0)/hd_mbr.bin (rd)
map --in-situ (hd0,4)+1 (hd0)
map --hook
dd if=(rd)+1 of=(hd0)
chainloader (hd0,0)/bootmgr
回复

使用道具 举报

11#
 楼主| 发表于 2012-11-12 18:51:55 | 只看该作者

回复 #10 zhaohj 的帖子

我这里没有逻辑分区,都是主分区。
请问执行dd命令后,修改的是硬盘的mbr还是虚拟盘的mbr?
回复

使用道具 举报

12#
发表于 2012-11-12 21:14:18 | 只看该作者
写 --in-situ 的虚拟分区表,如果真的写入成功,那就完蛋了。就是说,那样就写入到真实硬盘的 MBR 上了。因此,千万不要尝试这么做。当然,你可以先用虚拟机来试验,目的是观察操作的结果是怎样的。

--------------------

试试今天编译的版本。增加了 map --in-situ=FLAGS 的用法。目前只有 FLAGS 的最低位是有意义的。

map --in-situ=1 ........

意思是虚拟的分区表只保留 (hdX,0),而把其它分区表项 (hdX,1), (hdX,2), (hdX,3) 都清零。
回复

使用道具 举报

13#
 楼主| 发表于 2012-11-12 21:21:17 | 只看该作者

回复 #12 不点 的帖子

谢谢不点大给我开小灶了!弱弱的问一下,哪里获取?
回复

使用道具 举报

14#
发表于 2012-11-12 21:27:43 | 只看该作者
在这个论坛以及时空论坛都能找到。
回复

使用道具 举报

15#
 楼主| 发表于 2012-11-12 22:24:34 | 只看该作者

回复 #14 不点 的帖子

试一下,其它分区表项确实都清零了;不过最终的目的没有实现。
原因是还需要修改分区信息,除了保留最后4个字节总扇区数不变外,其余12个字节都要改成分区1的信息,这样才能让系统认为启动的vhd位于分区1。
这样的改动已经很不具有通用性了!不好意思让不点大白忙活了。

[ 本帖最后由 2012wuzhong 于 2012-11-12 22:35 编辑 ]
回复

使用道具 举报

16#
发表于 2012-11-12 22:42:57 | 只看该作者
那再dd 12个字节啊,这样问题不就解决了吗?
回复

使用道具 举报

17#
 楼主| 发表于 2012-11-13 13:16:48 | 只看该作者

回复 #16 zhaohj 的帖子

应该行不通的,--in-situ 的虚拟分区表是用代码模拟出来的!
回复

使用道具 举报

18#
发表于 2012-11-13 21:15:32 | 只看该作者

回复 #15 2012wuzhong 的帖子

除了保留最后4个字节总扇区数不变外,其余12个字节都要改成分区1的信息


你的映像没在那个位置,却要改成那个位置,这就有点胡说八道的味道了。
回复

使用道具 举报

19#
 楼主| 发表于 2012-11-13 21:53:24 | 只看该作者

回复 #18 不点 的帖子

对不住不点大了,这个我确实没有说清楚。
windows是通过硬盘签名和分区的起始扇区号来识别硬盘分区的。
而我需要实现的是,用其它分区来模拟分区1。这样的话,必须修改分区信息使得其它分区和分区1一样(除了分区大小以外),也就是分区信息的前12个字节。
刚开始我并不明白“--in-situ”的虚拟机制。现在我感觉用这个参数实现不了我的需求。修改了分区的起始扇区号,恐怕系统无法通过mbr找到该分区了。
我的方法是在分区2之前植入了一个mbr,然后将此和分区2虚拟了一个硬盘,此时分区2的起始扇区号可以和分区1的一样,因为对于新虚拟的硬盘而言,分区2已经是新的分区1了

[ 本帖最后由 2012wuzhong 于 2012-11-13 22:14 编辑 ]
回复

使用道具 举报

20#
发表于 2012-11-14 20:45:10 | 只看该作者

回复 #19 2012wuzhong 的帖子

我是半开玩笑,可别太认真。如果不慎伤害到你,那我还是要道歉的。

in-situ 模式的虚拟,是比较特殊的。它的出现是有背景的。

普通的虚拟,是把硬盘上某一块连续扇区空间仿真为一个硬盘、软盘或光盘。这种虚拟盘,win98 有可能不承认的。后来发现,win98 能够承认 in-situ 模式的虚拟盘。这也就是 in-situ 产生的背景了。普通人一般用不到 in-situ 模式的虚拟。

in-situ 的特殊性就在于,它有一部分是像整盘映射,而另一部分又有点像磁盘仿真。

比如,map (hd0) (hd1) 就是整盘映射。从原点开始就全部映射了,即,从扇区0 ( MBR )开始,(hd0) 的全部扇区都映射为 (hd1) 的扇区,扇区的序号保持完全一致,一一对应:

访问虚拟盘 hd1 的 扇区 0 就等于是在访问真实盘 hd0 的扇区0,
访问虚拟盘 hd1 的 扇区 1 就等于是在访问真实盘 hd0 的扇区1,
访问虚拟盘 hd1 的 扇区 2 就等于是在访问真实盘 hd0 的扇区2,
.......
依次类推。

但磁盘仿真就不同了,比如 map (hd0)100+900 (hd1),它有一个偏移量 100,而不是从原点 0 开始的:

访问虚拟盘 hd1 的 扇区 0 就等于是在访问真实盘 hd0 的扇区100,
访问虚拟盘 hd1 的 扇区 1 就等于是在访问真实盘 hd0 的扇区101,
访问虚拟盘 hd1 的 扇区 2 就等于是在访问真实盘 hd0 的扇区102,
.......
依次类推。


而 in-situ 方式的仿真,map --in-situ (hd0)100+900 (hd1) 是这样的:

访问虚拟盘 hd1 的 扇区 0 就等于是在访问真实盘 hd0 的扇区0,但分区表被修改了。
访问虚拟盘 hd1 的 扇区 1 就等于是在访问真实盘 hd0 的扇区1,
访问虚拟盘 hd1 的 扇区 2 就等于是在访问真实盘 hd0 的扇区2,
.......
依次类推。

也就是说,除了扇区 0 以外,其余的扇区完全像整盘映射那样,一一对应。即使扇区 0 也是对应着的,只不过分区表被虚拟化了。

比较一下,整盘映射的情况是不修改分区表,不修改任何扇区的内容。也就是说,整盘映射只把 BIOS 盘号进行虚拟化,而扇区的内容保持不变,每个扇区的内容是实实在在的,没有被虚拟化,没有被修改。

对于磁盘仿真的情况,不仅盘号被虚拟,而且扇区序号也被虚拟,即,偏移量不是0。但扇区内容也是真实的,没有被修改。

对于 in-situ 的情况,盘号被虚拟,扇区序号是真实的(未被虚拟),但第一扇区 MBR 尾部的分区表被虚拟,即,该扇区的内容被虚拟化代码更改了。其它扇区都是真实的(未被虚拟)。


自己看自己究竟需要哪种方式,作出选择。通常大家都是用普通的虚拟方式,而不是 in-situ 的虚拟方式。
回复

使用道具 举报

21#
 楼主| 发表于 2012-11-14 21:33:43 | 只看该作者

回复 #20 不点 的帖子

感谢不点大的详解,使我更加了解了 in-situ。
对于这次更改,确有对不住的地方。在需求没有表达清楚就要求更改,有点冒失了。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-9-23 00:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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