|
@yaya
我来答复,但脑子不好使,不一定都准确,仅供参考。
1、map --status=0xff 似乎是 chenall 增添的功能,而且文档没有公开。它的作用好像是,确定内存盘 (0xff) 的起始内存地址。简单说,是 chenall 开发的未公开功能。
2、(md)0x18000+0x400,20 这个表达法是 gnu grub 0.97 的一个未公开特性。逗号之前是文件的扇区描述部分,最后的逗号后的数字表示文件的长度(精确到字节)。通常,在文件的 “扇区列表的表达法” 中,文件长度只可能是 512 字节的倍数。利用这个未公开的特性,你可以 “手动指定文件长度”,即,在文件的扇区列表尾部添加一个逗号,紧跟一个整数,表示文件的长度(单位是字节数)。例如,(hd0)+1,0x1be 就表示硬盘 (hd0) 的 MBR 的开头的 0x1BE 个字节(即,不含分区表的引导代码部分)。如果没有 “,0x1BE” ,那么它的长度就是一个扇区(即 512 字节)。需要说明的是,所指定的文件长度不可以超过 “扇区列表” 中本来具有的文件长度。举例来说,像下面这样用是错误的(危险的):
(hd0)+1,513 【<----- 注意,这是错误的,不可以这样用】
错误就在于,扇区列表部分只有一个扇区,而后面企图指定的文件长度却超过了一个扇区。警告:错误的使用方法,其后果是未知的,比如说,有可能对硬盘造成不可挽回的损失。
3、讨论一下 “--mem=N”,这是我开发的功能。
情况一:如果 N 为负数,则表示内存盘最小要占用 (-N)个扇区【注意 “-N” 是 “负N”,负负得正,此时 -N 就是正数了】,换句话说,就是 map 命令为这个内存盘最少保留 (-N)个扇区。进一步解释,假如 IMG 的长度小于 (-N)个扇区,则 map 创建的内存盘将是 (-N) 个扇区;假如 IMG 的长度大于(-N)个扇区,则 map 创建的内存盘就是 IMG 的长度。
需要这个功能的可能情况(举例):
如果你有一个 1.44M 的软盘 img。你的 IMG 的开头部分有一些数据(比如说占用开头的 400KB),后面全都是空白扇区 (00 填充)。此时,为了节约 IMG 的大小,你把 IMG 后面的 00 扇区 “阉割” 掉。这样,IMG 的总长度就是 400K 了。但是,软盘的文件系统需要 1440K,因此,你需要用 --mem=-2880 (注意此处应该是负数,不要搞错)参数来保证 “位于内存中的内存盘的长度至少是 1440K”。假如没有这个参数,那么,由于内存盘的长度是 400K,那么将来在读写内存盘时就可能出现一些有关 “文件系统” 的错误。
情况二:如果 N 为正数,则表示使用固定的内存地址 N(单位也是 “扇区数”)来存放 IMG。举例来说,当你需要把 IMG 映射在固定地址 128M 处时,可以使用 --mem=0x40000。实际上,从 128M 开始的该内存 “碎片” 的高端就全部被这个内存盘占用了,只有低端的 128M 是自由内存。如果内存有多个碎片,其它碎片仍是自由内存。
需要这个功能的可能情况:
(1)win98 不能在大于 2G 内存的机器上启动。举例来说,如果机器有 4G 内存,而想启动 Win98,则可以用一个内存盘来占用(即,消耗掉)高端的内存,让操作系统只能见到 2G 或更少的可用内存。内存盘地址可以设置为固定的 2G【如果启动 Win98 还是失败,那就设置为 1G 或更少】。
(2)你想临时使用某个低端的内存区域来作为内存盘,用完后立即撤掉(unmap)这个内存盘。此时你需要 map 命令能够把内存盘安排在你自己所设定的固定地址处。
|
|