欢迎大家光临【无师自通-教程网】您的到来是我们的荣幸。本站提供photoshop教程,ps教程,flash教程,cad教程,网页制作教程,excel教程,asp教程,vb教程,3d教程,c语言教程,html教程,coreldraw教程,dreamweaver教程,java教程,3dmax教程 等各种教程为主题的内容和服务,相信您会在这里找到您所需要的东东。无师自通伴您一生-谢谢您的光临!!
网站地图 设为首页
简繁切换 加入收藏
栏目待定 留言本站
您现在的位置: 无师自通-教程网 >> 操作系统 >> Linux >> Linux软件 >> 教程正文

  没有公告

教程: Linux教程-软件教程-GRUB for DOS 磁盘仿真命令简介 更多...
教程: Linux教程-软件教程-GRUB for DOS 磁盘仿真命令简介

3。如果您不用 0.1.x 的,请尽量用版本 0.2.x 的,不要用更高的。
   4。如果您用 0.2.x 的版本,请尽量不要用 map 等磁盘仿真命令。
   5。如果您用 0.2.x 的版本,也用了 map 命令,请尽量先在虚拟机中测试运行。
   6。版本 0.2.x 在您的虚拟机中测试过了之后,在真实机器中尽量用 --read-only 等参数运行。
   7。尽管已经把 map 命令加上了 --read-only 等参数,但也请尽量不要启动 Windows。
   8。如果要启动 Windows,请尽量不要把用来仿真的 img 映像安置在 (hd0) 驱动器上。
   9。如果启动了 Windows,即便仿真磁盘的映像不在 (hd0) 驱动器上,您也得做好最坏的打算:其一,如果仿真映像被毁,您不要感到出乎意料;其二,如果某个真实磁盘全部被毁,您不要感到难以接受;其三,如果您的所有的、全部的硬盘都报废了,您也不要感到太奇怪。
   10。版本 0.2.x 以后的仿真技术是给熟练的电脑玩家作为研究的目的来使用的,不是给普通用户使用的。
   11。玩家们最好互相交流经验,研究别人在使用过程中失败的情况,详细阅读说明文档,避免使自己遭受不必要的损失。

   在初期的测试中暴露出很多问题,也损坏过很多硬盘,所以在这里特别通报一下,并写出了上述注意事项。


map 命令的新功能是有某种危险的,建议首先在 VMware 或者 Virtual PC 这类虚拟机中测试。先用 --read-only 或者 --fake-write 参数运行 map 命令,这样是在只读状态下测试,安全一些。只读测试一段时间后,没有问题的话,再进行全面测试。测试时,在 grub 所仿真的虚拟磁盘上安装 DOS/Win9x/Me,不要用别的操作系统。即使全部测试都成功,这个仿真技术也仍然有着它固有的危险性。这是基于 BIOS 的仿真,不是全方位的仿真。例如,当你格式化一个磁盘的时候,你得明白这个磁盘是不是仿真了的? 以及你所用的格式化软件是使用 BIOS 呢? 还是使用磁盘 IO 端口读写? 使用 BIOS 的格式化软件,在仿真之下是安全的。使用磁盘 IO 端口的格式化软件,当它格式化一个仿真了的磁盘时,在最坏的情况下,实际上会格式化你的真实硬盘,至于说这种危险的误操作会发生在哪个硬盘上,取决于使用了什么样的 map 命令集(参考下面的“技术细节和实现方法”一节)。更进一步的测试,请大家报告 DOS 的 format 命令、Windows 资源管理器的格式化命令、磁盘碎块整理命令等等,以及第三方生产的 HD-COPY 等工具软件在进行格式化操作时是否安全。


技术细节和实现方法:


GRUB for DOS 0.2.x 将要对各种规格的软盘映像给以支持。由于硬盘的仿真也很类似,所以,也要对硬盘的 img 给以支持。另外,GRUB for DOS 0.2.x 也要开放写入虚拟磁盘的操作(写入虚拟盘是一种危险的操作,因为实际上我们写入了硬盘的 img 文件中,万一 GRUB for DOS 0.2.x 的仿真程序有 BUG,写入硬盘其它扇区中,可能造成数据毁损、无法启动等严重问题!)。


对软盘规格:需要解决的技术问题是如何恰当地处理三维的几何地址,也就是平常所说的 CHS(C——磁道柱面号;H——磁头号;S——扇区号)。对于真实的软驱(和软盘),都有这些规格的。然而,我们仿真之后的 img 文件,却无法表示这些规格。例如,一个 1.44M 的没有格式化的 img 文件,里面的数据全部是 00,怎么确定其 CHS 值呢?

当 img 文件已经经过 DOS 的格式化时,就用软盘第一扇区的 BPB 表来确定 CHS 值。如果没有经过 DOS 的格式化,或者发现其 BPB 表是错误的,那么就根据 img 文件的大小来确定 CHS 值。如果是标准的(或者常用的)软盘 img 尺寸,如 1.44M,1.2M,2.88M 等等,就用已知的 CHS 值。我们支持的软盘尺寸甚至可以是任意的(非标准的),如 10M 或 50M 或 500M 的软盘 img 文件。这时候,如果 BPB 表中没有合法的 CHS 值,就需要用 map 命令行参数来手动设置 CHS 值了。如果命令行没有指定 CHS 值,给出一个错误信息,拒绝仿真。当软盘 BPB 表和 map 命令行都有 CHS 的指定时,以命令行的指定为准,如果两者有差别,给出一个警告信息。

软盘规格列表(不支持扇区大小不等于 512 字节的防拷贝加密软盘):

软盘容量    每面磁道数    每道扇区数    磁头数或面数
----------------------------------------------------------------
0160K(标准)    40        08        1  
0180K(标准)    40        09        1  
0200K       40        05        2  
0250K       50(暂用)     10(暂用)     1  
0320K       80        08        1  
0320K(标准)    40        08        2  
0360K(标准)    40        09        2  
0400K(优先)    40        10        2  
0400K       80        05        2  
0420K       42        10        2  
0500K       50(暂用)     10(暂用)     2  
0640K       80        08        2  
0720K(标准)    80        09        2  
0729K       81        09        2  
0738K       82        09        2  
0747K       83        09        2  
0756K       84        09        2  
0800K       80        10        2  
0810K       81        10        2  
0820K       82        10        2  
0830K       83        10        2  
0840K       84        10        2  
0902K**      82        11        2  
0984K**      82        12        2  
1066K**      82        13        2  
1200K(标准)    80        15        2  
1215K       81        15        2  
1230K       82        15        2  
1245K       83        15        2  
1260K       84        15        2  
1360K       80        17        2  
1377K       81        17        2  
1394K       82        17        2  
1411K       83        17        2  
1428K       84        17        2  
1440K(标准)    80        18        2  
1458K       81        18        2  
1476K       82        18        2  
1494K       83        18        2  
1512K       84        18        2  
1558K**      82        19        2  
1600K       80        20        2  
1620K       81        20        2  
1640K       82        20        2  
1660K       83        20        2  
1680K       84        20        2  
1680K(优先)    80        21        2  
1701K       81        21        2  
1722K       82        21        2  
1743K       83        21        2  
1764K       84        21        2  
1804K**      82        22        2  
1886K**      82        23        2  
2880K(标准)    80        36        2  
3198K       82        39        2  
3608K**      82        44        2  
3690K**      82        45        2  
3772K**      82        46        2  

(感谢 Roy 兄提供了大量的磁盘规格资料)

硬盘比软盘复杂了一些。硬盘第一扇区不是 DOS 的引导区,而是主引导记录(MBR),这里没有 BPB 表,而是有一个分区表。所以,对于硬盘的 CHS,作如下的处理:

当没有分区表或者分区表错误时,必须由 map 命令行来指定 CHS,否则拒绝仿真。当分区表存在时,由四个分区表项中的任意一项都可以确定 H 和 S 的值。再用 img 文件长度即可确定 C 的值。【大硬盘的 CHS 值也是可以用这种办法来确定的。】

也可能有人不愿意给出命令行 CHS 参数,他们希望 grub for dos 任意选择一个适当的值。map 命令将提供这样一种选项。首先根据上述 BPB 或分区表来确定CHS,如果失败,再用以下的办法来确定。对于软盘,尽量采用具有 2 个磁头的参数。对于硬盘 img 文件,如果让 GRUB for DOS 来自动挑选,则总是选择 63个扇区、256 个磁头。

drive_map_slot 结构:

字节:FROM_DRIVE——把哪个 BIOS 磁盘号映射到另外一个磁盘号或者映射到另一个 img 文件?
字节:TO_DRIVE——被映射到的磁盘号。BIOS 磁盘号:0,1,……表示软盘,0x80,0x81,……表示硬盘。
字节:MAX_HEAD——最大磁头号。取值范围:0 至 255。

字节:MAX_SECTOR——最大扇区号。取值范围:1 至 63。
4字节:START_SECTOR——被映射到的 img 文件的起始扇区号。
4字节:SECTOR_COUNT——被映射到的 img 文件的扇区总数。必须是偶数。

当 MAX_SECTOR 的取值为 0 时,表示禁止常规磁盘读写中断(例如int13/AH=02)【map 的命令行参数 --disable-chs-mode】。MAX_SECTOR 的最高两位还有用。最高位为 1 表示只读操作【map 的命令行参数 --read-only 或者 --fake-write】,写入仿真软盘的扇区数据统统丢弃。次高位为 1 表示禁止扩展磁盘读写中断(例如 int13/AH=42H)【map 的命令行参数 --disable-lba-mode】。SECTOR_COUNT 是总扇区数。这个数目必须是偶数(当它为奇数时,处在末尾的一个扇区不参加仿真)。因此,SECTOR_COUNT 的最低位还有用。当该位为 1 而且 MAX_SECTOR 的最高位也为 1 时,表示“伪装写入扇区”操作【map 的命令行参数 --fake-write】。“伪装写”和“只读”是类似的,区别在于,“只读”在扔掉写入的扇区之后,告诉调用者程序说:“该盘写保护,不能写入”;而“伪装写”在扔掉写入的扇区之后,欺骗调用者程序说:“成功写入,请继续吧。”【我们有时候确实是需要这个功能的】。当 START_SECTOR 为 0 并且 SECTOR_COUNT 的高 31 位都为 0 时,表示用整个磁盘(而不是其中的一部分扇区段)来仿真【SECTOR_COUNT 的最低位表示“伪装写”】,这样仿真的效率要高一些【GNU GRUB 原来的仿真就是这样的,代码也很简单】。

当 SECTOR_COUNT 为奇数(也即 --fake-write 置位)而 MAX_SECTOR 的最高位为 0(也即 --read-only 没有置位)时,称为 safeboot,此时虽然允许写入虚拟磁盘,但不允许写入虚拟磁盘的第一扇区(引导区)。而且如果虚拟磁盘映象是一个硬盘映象,也不允许写入第 0 柱面第 1 磁头第 1 扇区(也就是逻辑扇区号 LBA=63 的扇区,该扇区通常是操作系统的引导扇区,例如 DOS 的 boot record)。这是对于 int13/AH=03h 来说的。程序并不禁止 int13/AH=43h (扩展写盘功能)的写入。也就是说,用 int13/AH=43h 可以写入任何扇区。 safeboot 默认时是开启的,可以使用 map 命令行参数 --unsafe-boot 来关闭它。【注:不存在 --safe-boot 选项。默认时之所以打开 safeboot,是因为曾经碰到 win98 破坏引导区的事情发生。如果您不准备启动 win98,您可以加上 --unsafe-boot 选项,从而允许 int13/AH=03h 写入引导扇区。很明显,只有在对虚拟盘进行分区以及格式化、或者运行 dos 的 sys 命令时才需要 --unsafe-boot 选项。】

map 命令还有两个命令行参数:

--heads-per-cylinder=NUM_HEADS

--sectors-per-track=NUM_SECTORS

NUM_HEADS 的取值范围是 1 至 256;NUM_SECTORS 的取值范围是 1 至 63。但它们也允许是 0,这表示用户允许 grub for dos 任意挑选一个合适的值。如果 map 的命令行没有指定 --heads-per-cylinder 以及 --sectors-per-track,那么,当 grub for dos 不能从 img 文件的第一扇区探测到一个合适的值时,会给出错误信息并拒绝仿真。

这里指出一点限制。GRUB for DOS 扩展了原来 GNU GRUB 的仿真。GNU GRUB 原来的仿真是一种简单的仿真,只能仿真整个磁盘,不能用一部分扇区来仿真。新的仿真可以用磁盘上的部分扇区序列来仿真,但是,这个功能的实现,利用了新型 BIOS 的逻辑块寻址(LBA)功能,也就是磁盘扩展读写功能。这对于老旧的 BIOS 是无效的。所以,老的 BIOS 无法利用新的仿真功能。但 GRUB for DOS 兼容 GNU GRUB 的仿真,所以,老的 BIOS 仍然可以用 GRUB for DOS 的“用整个磁盘来仿真”的功能,这是原来 GNU GRUB 本来就有的功能,其用法在 grub for dos 中完全没有变化。

可以在 grub> 提示符下用 help map 命令察看即时帮助信息。

下面介绍另外几个 map 命令行参数的用法。

map --status 这条命令显示磁盘仿真的状态,很有用。所显示的状态标题栏中,最右边的 Hk 表示 hook 的意思,其值是两位二进制数 xy,因此取值有四种:00,01,10,11。当 x 为 1 时,表示现在 grub 正在使用该虚拟磁盘。当 x 为 0 时,表示现在 grub 没有使用该虚拟磁盘。当 y 为 1 时,表示在运行 map --rehook 命令之后,grub 将使用该虚拟磁盘。当 y 为 0 时,表示在运行 map --rehook 命令之后,grub 将不使用该虚拟磁盘。

map --status 命令所显示的其它状态值都是容易理解的,它们都是以十六进制来表示的数值。

map --hook 这条命令用于直接在 grub 内部就开始使用仿真。通常 grub 本身是不使用仿真的,有了这条命令之后,从 grub 命令行就可以开始检验仿真的效果了。cool!关闭这个功能的命令是 map --unhook

map --unhook 正如上面解释的,关闭 grub 的即时仿真功能。

map --rehook 这条命令的用途:当你使用了 map --hook 命令之后,又用了新的 map 命令映射了别的磁盘,那么,你可以用 map --rehook 命令来激活全部这些仿真。这条命令等价于以下两条命令接连发出:

map --unhook
map --hook

当撤销磁盘仿真时,仅仅用 map --unhook 是不够的,还需要用类似于 map (fd0) (fd0) 的命令来撤销 (fd0) 的仿真。“map --unhook”命令仅仅使得在 grub 命令行之下不再使用仿真了,当您用 boot 命令时,会自动再次 hook 上。要想使得某个 map DESTINATION FROM_DRIVE 命令彻底失效,必须用 map FROM_DRIVE FROM_DRIVE 命令来撤销它【将某个 BIOS 磁盘号码映射到它自己,就意味着撤销它】。撤销部分 BIOS 磁盘号码的仿真之后,一般还需要运行 map --rehook 命令。例如,“map (hd1) (hd1)”命令撤销了对 (hd1) 的仿真,但在运行“map --rehook”之后才起作用。

一些遗留问题:

1。支持从 ISO 映像文件启动。(情况复杂,有难度)
2。支持从 CDROM 启动。(情况复杂,有难度)
3。支持从 win98 下直接运行 grub。(技术难度高)
4。自动探测和恢复 BIOS 中断向量,从而使 grub for dos 支持任意的实模式 DOS。(技术难度中等)
5。在 emm386 运行时也能运行 grub for dos(首先解决从保护模式切换到实模式)。(技术难度高)
6。解决在磁盘仿真时和 win98 的一些冲突问题。(技术难度高)
7。增加退出到 DOS 的功能。(技术难度中等)
8。创建一个可以生成“具有连续磁盘扇区的文件”的工具。

欢迎有兴趣的朋友继续对 GRUB for DOS 作进一步开发。

致谢:

   中国 DOS 联盟之 联合 DOS 论坛 上的朋友们给予了大量的测试、建议、帮助,衷心感谢各位。特别感谢 Wengier 在技术上给予的很多直接帮助,尤其是他对于“32位磁盘存取”的深刻洞察,帮助解决了 GRUB for DOS 0.2.0 所遇到的一个关键技术障碍。



[3] [4] [5]

上一页  [1] [2] [3] [4] [5] 下一页

教程录入:admin    责任编辑:admin 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
     
     
     

    dos入门教程

    dos入门教程-2

    dos入门教程-1
    免责声明!本站资料大部分来自于互联网,其版权归原作者或其他合法者所有.如内容涉及或侵犯了您的权益,请通知本人,我将尽快处理!.欢迎您的光临。
    辽ICP备07003958号
    无师自通,伴你一生-教程网