|
|
发表于 2011-9-6 20:27:36
|
显示全部楼层
何必那么认真?原始的作者这么用,肯定有他的意图。说不定,他发现必须这么 “绕弯” 才能在他的机器上成功。也有可能他在将来某个阶段要用这个 fd0,比如把某个软盘 “克隆” 到这个 fd0 上。
map --mem (md)+2880 (fd0)
这句,是把内存开始处的 2880 个扇区 “拷贝到” 扩展内存的顶端,仿真为 (fd0)。
如果要把 中断向量表 处的内存仿真为 (fd0),那应该这样写:
map --mem=0 (md)+2880 (fd0)
但这样写实际上也会出错的,因为 map 会自动禁止在低端内存上 “就地” 仿真一个磁盘。低于 16M 的地址,都不可以作为仿真盘的扇区数据,因为 grub4dos 本身就占据低端 16M。
因此,这条 dd 命令没有破坏中断向量表。它把 (fd1) 的引导扇区复制到 (fd0) 上。(fd0) 的实际扇区数据位于内存顶端。
=====================
忽然发现还有问题。在默认情况下,仿真盘的引导扇区是受保护的,拒绝写入(把写入的数据扔掉)。
因此,这条 dd 命令恐怕是无效的。要得让引导扇区可以写入,必须在 map 时添加 --unsafe-boot 参数。
=====================
又有新的解释了。dd 也可能有效。当 (fd0) 的第一扇区尾部没有 55 AA 标签的时候,这个扇区可能就自动不被保护了。
=====================
综合以上两条,当第一次写入的时候,也许会成功,因为 fd0 的第一扇区本来就不合法(没有 55 AA 标志)。但是,一旦把一个含有 55 AA 标志的引导扇区写入了 fd0,那么,下一次就无法写入了,因为保护起作用了。前面说了,要得让保护失效,必须用带 --unsafe-boot 参数的 map 来重新映射 (fd0)。
以上这些,在文档中并未公开。因为通常用不到这些内容。
[ 本帖最后由 不点 于 2011-9-6 20:46 编辑 ] |
|