无忧启动论坛

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

[求助] 菜单有没有方法识别电脑主机?

[复制链接]
跳转到指定楼层
1#
发表于 2012-8-16 21:42:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在硬盘上装了双系统,win 和 linux,grub4dos写入了mbr。
在win系统中安装了vmware,虚拟机中设置了物理硬盘作为虚拟机硬盘,通过grub4dos可以在虚拟机中启动硬盘上linux系统。
现在有一个问题:menu.lst的菜单默认为win,打开虚拟机时需要手动选择linux。我有个想法,根据条件来设置不同的default项,但是grub4dos有没有办法识别我启动的环境是物理主机还是虚拟机呢?
不知道我有没有说清楚我的问题,期待大家的解答。
2#
发表于 2012-8-16 21:57:36 | 只看该作者
这个问题提得好。我以前也遇到过这样的问题,但我却没有去寻找解决办法。

其实,解决办法是有的,可能有很多种解决办法。


我说说我此刻能想到的一种吧。根据 BIOS 的不同,即可区分主机和虚拟机。

虚拟机的 BIOS (ROM) 也是虚拟的。所以,你大概可以在虚拟机的 ROM 空间中找到 Vmware 之类的字符串。真实机的 ROM 里面应该不会有 vmware 之类的字符串。然后你再设法写一个含有条件判断的菜单即可。
回复

使用道具 举报

3#
 楼主| 发表于 2012-8-16 22:06:08 | 只看该作者

回复 #2 不点 的帖子

嗯,我想到的也是bios。我对grub4dos的命令不熟,可以告诉我可能会用到的几个命令吗?这样我可以有针对性地查资料。
回复

使用道具 举报

4#
发表于 2012-8-16 22:39:22 | 只看该作者
你知道,grub4dos 能够访问内存,所以,ROM 的内容也是可以查看的。

你可以在命令行下用 cat 、read 之类的命令查看内存的内容。查看内存之后,字符串搜索、比较之类的,似乎还需要一定的技巧。比如,cat 命令就可以用来搜索字符串。是否成功搜到,cat 会返回一个数值。返回 0 表示失败。利用条件操作指令,即可写出你的菜单。多多研究文档吧。
回复

使用道具 举报

5#
 楼主| 发表于 2012-8-16 23:12:00 | 只看该作者

回复 #4 不点 的帖子

好,谢谢~~我去研究研究
回复

使用道具 举报

6#
 楼主| 发表于 2012-8-17 23:02:16 | 只看该作者

回复 #4 不点 的帖子

昨晚折腾了很久,cat内存地址很多都显示乱码;网上说,bios加载在内存的地址是从0xFFFF开始,cat一段地址,似乎没什么信息。用read读地址呢,得到的则是16进制数。。。读bios信息的方法我没有成功。。。
后来又想到物理启动和虚拟机启动内存的大小上有区别,于是用read读到内存大小来判断,功能是实现了,不过不完美啊
回复

使用道具 举报

7#
发表于 2012-8-23 06:41:28 | 只看该作者
编译了一个版本,上载到时空论坛,应该可以解决你的问题了。

当 grub4dos 处于 VMware 虚拟机中的时候,位于物理地址 0x8350 处的字符串应该是 VMwareVMware,这就可以判断出 VMware 的存在了。



  1. cat    --hex    (md)0x41+1
复制代码


读出 0x8200 处的一个扇区,在偏移 0x150 处就会显示出字符串 VMwareVMware 。

如果不是在虚拟机中(而是在真实机中),那么 0x150 处应该是 00 字节。

如果是在其他虚拟机中,0x150 处究竟是什么字符串,由这个虚拟机的虚拟 cpuid 来决定。

[ 本帖最后由 不点 于 2012-8-23 06:57 编辑 ]
回复

使用道具 举报

8#
 楼主| 发表于 2012-8-25 22:41:53 | 只看该作者
有VMwareVMware字符串,怎么写条件判断呢,查找字符串,我只知道grep命令。。。

[ 本帖最后由 2012ace 于 2012-8-25 22:46 编辑 ]

QQ截图20120825224123.png (11.77 KB, 下载次数: 38)

QQ截图20120825224123.png
回复

使用道具 举报

9#
发表于 2012-8-26 07:41:17 | 只看该作者

回复 #8 2012ace 的帖子

哇塞!成功了!可是 zxw 怎么总是失败呢?难道与版本有关系?或者与人品有关系?你用的是什么版本的 VMware?

看到 01 02 00 80 了吗?把它写成一个整数,它就是 0x80000201,其最高位是 1(即,0x80 的最高位是 1),表示虚拟机管理器存在。

你也可以简化判断,只要判断出 0x308000 处的四个字节是 VMwa (0x61774D56)就行了,例如:

  1. checkrange 0x61774D56 read 0x308000 && goto vmware
复制代码
回复

使用道具 举报

10#
 楼主| 发表于 2012-8-29 22:24:40 | 只看该作者

回复 #9 不点 的帖子

我的是 vmware 7.1.0
回复

使用道具 举报

11#
发表于 2012-10-22 22:07:27 | 只看该作者

我也来测试,虽然很迟了

测试平台:Win8 RTM 企业版
               VM 9.0     绿色版

win8G4D.jpg (44.84 KB, 下载次数: 19)

win8G4D.jpg
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-14 19:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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