无忧启动论坛

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

[已解决] VBE模式在VirtualBox下用不了,另外,VBE相关命令的用户交互似乎有问题

  [复制链接]
跳转到指定楼层
1#
发表于 2013-12-15 13:33:59 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 stevenldj 于 2013-12-24 18:51 编辑

使用环境 Ubuntu 13.10 amd64 + VirtualBox 4.2.16,虚拟机类型使用 Windows XP,grub4dos-0.4.5c-2013-11-30.7z

在虚拟机的 Grub4Dos 命令行中输入 setvbe 800x600x32,确认后,屏幕全黑,但是可以继续输入命令,只是看不见输入的是什么,输入 reboot 还可以重启。设置其它分辨率也是一样。而通过 graphicsmode -1 800 600 却可以正常修改分辨率。在 Windows 下用 FbinstTool 的 Qemu 虚拟机测试,也是同样的效果。在实际电脑中测试也是同样的效果,不过实际电脑中好一点,可以切换各种8位的显示模式。

还有,VirtualBox 和 Qemu 在 gfxmenu /message 环境下,通过菜单进入 commandline 后,屏幕下方花屏(Qemu黑屏),同样可以继续输入命令,输入 halt 还可以关机。



另外关于VBE相关命令交互的问题,输入 vbeprobe 后,一屏显示不完,提示 [Hit Q to quit, any other key to continue],此时按 q 或者 Q 都不会退出,而是 continue。setvbe 也同样存在这个问题。

另外问几个初级问题:《0401更新,grub4dos0.4.5c帮助文档》的“设备命名规则”一章中说“cd      :     0x9F (这个不一定正确,视bios而定)”,这里的设备 (cd) 有什么作用?我们平时访问光驱不都是用 (cd0)、(cd1) 这样的设备吗?用 (cd) 能访问什么呢?

在《0401更新,grub4dos0.4.5c帮助文档》的“设备命名规则”一章中说“nd 为 network device ,网络驱动器,现已不常用”,(nd) 是什么设备,能否给个具体例子?

还有关于内存的一些疑问,如果用户需要一些缓冲区来存放数据,比如临时的菜单文件,用什么范围的内存比较合适呢?看《0401更新,grub4dos0.4.5c帮助文档》中“内存使用简析”一章中说:

现在 grub4dos 本身对常规内存的占用情况如下:
00000~10000 被 grub4dos 的程序代码和堆栈占用。
10000~20000 为 grub4dos 将来的代码和数据保留。
20000~30000 被 grub4dos 内核中的自动几何参数探测占用,作为缓冲区。
30000~38000 被 grub4dos 内核中的常规磁盘读写缓冲区占用。
38000~40000 保留给 grub4dos 将来的扩展。
100000~110000 被 dd 命令的磁盘缓冲区占用。

是不是用 100000 之后的内存就安全呢?向内存中写入数据,会不会影响到 map 出来的内存盘?我看到在有些菜单中,使用 20000~30000 这个范围的内存来存放临时数据,不知到有没有相关的内存使用规范?



2#
 楼主| 发表于 2013-12-15 23:46:00 | 显示全部楼层
本帖最后由 stevenldj 于 2013-12-16 00:06 编辑

谢谢“不点”老大的指点,基本上明白了,但是关于 1M 以上的空间还有疑问:

位于 1M 以上的内存,叫做扩展内存。用户不可以直接使用扩展内存。扩展内存中,位于地址 32M 以内的这部分空间,是由 grub4dos 内核使用的。地址 32M 以上,则由用户的 “32位可执行程序” 使用。用户不可以直接写入这些空间,因为那可能破坏 grub4dos 内核,也可能破坏用户的可执行程序的代码或数据。


在《0401更新,grub4dos0.4.5c帮助文档》的“命令索引”一章中说:

dd
用法: dd if=IF of=OF [bs=BS] [count=C] [skip=IN] [seek=OUT] [buf=ADDR] [buflen=SIZE]

更新: 新选项实现了让使用者自定义dd 命令的读写缓存。
默认读写缓存起始于地址0x50000,长度为0x10000 (即64KB)。
你不能指定起始地址ADDR 低于0x100000(即 1 MB)的缓存位置。
此外,你必须指定参数SIZE 大于0x10000(即64K)。
通常,你需要令ADDR大于或等于0x1000000 (16MB),并且 SIZE 也要大于或等于16MB 。
增大 SIZE 的值能够加快 dd 的读写速度。


按照上述说明,如果将 ADDR 设置为 16M,并且将 SIZE 设置为 32M,岂不是会破坏 grub4dos 内核。

关于存储自定义数据,我想了一个办法,通过 map --mem=-2880 /somefile (fd127) 的方式创建一个固定大小的内存盘,然后通过 (fd127)m+n 的方式存取自己的数据,不知道这样是否是比较好的方法。

是否应该考虑给用户预留一块内存,或者允许用户随时申请一块内存来存放自己的数据

还有,关于 (rd) 设备有什么用?什么时候会用到?《0401更新,grub4dos0.4.5c帮助文档》中没有详细说明。


回复

使用道具 举报

3#
 楼主| 发表于 2013-12-16 13:06:21 | 显示全部楼层
本帖最后由 stevenldj 于 2013-12-16 16:43 编辑

我理解开发团队缺少更多的人帮助开发 Grub4Dos,可惜我不懂 C 语言和汇编,也不懂硬件底层,所以帮不上什么忙,我能帮忙的只能是学好 Grub4Dos 的用法,然后将学习心得分享出来。

我知道怎么通过 map 命令设置 (rd) 设备,只是不知道 (rd) 设备有什么特性,设计这样一个 (rd) 设备是用来干什么的?什么情况下需要用到 (rd)。比如下面的代码:

# 备份旧 rd 信息
set /a rdnum=*0x82CC
set /a rdbase=*0x82D0
set /a rdsize=*0x82D8
# 设置新 rd 信息
map --mem --rd-base=50000
map --mem --rd-size=30000

这样的 (rd) 设备使用了 50000 - 7FFFF 的内存,这块内存会像 (fd126) 一样被保护起来吗?会被其它代码(比如 dd 的缓存)修改吗?这块内存使用完需要释放吗?对 (rd) 的特性和用途完全不了解。

还有一个问题,我通过 map --mem=-2880 /somefile (126) 获得了一块内存区域,如何得到这块内存区域的起始地址和内存块的长度(长度大概可以通过 2880x512 得到,起始地址如何获取)。

这些天在根据《0401更新,grub4dos0.4.5c帮助文档》学习 Grub4Dos,所以问题比较多,见谅!




回复

使用道具 举报

4#
 楼主| 发表于 2013-12-16 19:25:47 | 显示全部楼层
谢谢“不点”老大的指点,现在对内存的使用已经弄明白了,目前,为用户预留的内存空间是 0x50000-0x7FFFF,如果要使用被保护的内存空间,可以通过内存盘间接实现。(rd) 只是对内存的引用,不被保护,(rd) 很自由。
回复

使用道具 举报

5#
 楼主| 发表于 2013-12-17 18:15:24 | 显示全部楼层
嗯,知道了,不用 gfxmenu 了。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-8 12:45

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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