|
本帖最后由 不点 于 2013-5-17 18:02 编辑
不是早就说过,低端常规内存的大小(以 K 为单位)是以 0x413 处的 2 字节整数为准吗?这是 BIOS 规范,非常可靠,至今没有遇到这个规范被某个主板 BIOS 破坏的报道。在 google 中搜 “BIOS数据区”,了解有关的信息。
read 0x413 命令读出的是 4 字节,需要去掉高位的 2 字节,留下低位的 2 字节,才是用户可以自由使用的常规内存的大小(以 K 为单位)。可以给 chenall 提建议,增加必要的控制参数,让 read 命令可以读出 字节、双字节、四字节、8字节的整数,这样更方便使用。
grub4dos 的 map --hook 或者 map --rehook,就是把仿真代码放置在可用常规内存的顶部,那就要占用 12K 的常规内存了,同时会把 0x413 处的双字节整数的值减去 12。如果 BIOS 原来的常规内存为 524K,那么经过 map --hook 之后,就只有 512K 了,刚好够 Windows XP 使用。
接下来我补充说明几点,请注意。
因为有机器通过PXE启动后可用内存不够524K。这样我先MAP服务器上的镜像文件到本地。
然后卸载PXE内存,再启动镜像内的PE。
当 PXE 启动后常规内存低于 524K 时,你执行 map --hook,那么,常规内存将降低到不足 512K,也就是说,0x413 处的值将会小于 512,那么 XP 是无法启动的。此时你卸载 PXE 已经占用的较高端常规内存是没有用的,因为较低端的 12K 常规内存还没有卸载掉。你必须先卸载 map 的仿真代码所占用的内存,然后才可以卸载 PXE 的内存。已经有报道说,在某些 buggy 的主板(或网卡)之下卸载 PXE 的动作,会直接导致死机。因此,建议不要碰它,让它一直保持在常规内存中。这样的话,你必须寻找一个不使用 map 的方案,比如使用 memdisk,它占用的常规内存较小。你还可以寻找一个办法,把 PXE 服务器上的文件直接放置在扩展内存中,然后安排你自己的启动方案。这就可以避免使用 map 了。不过这就需要你编写自己的启动代码,做有针对性的处理了,应该是比较麻烦的,我自己缺乏这方面的知识,没有具体的方案。在不使用仿真的情况下,也可以使用 PXE 上的 IMG 文件,比如,把它放在内存中,让 (rd) 设备指向它,就可以以 (rd)/... 或 带分区的 (rd,0)/... 的形式来读 IMG 里的文件了。因此,困难在于,如果不使用 map,如何实现后续的启动操作系统的步骤。你可能还是需要一个类似于 memdisk 的软件,来完成 map 的任务。
Linux 是没问题的,比如完全运行于内存中的 Slitaz 就是可以的。grub4dos 可以直接加载 Linux 的内核以及 initrd 文件,实现 Linux 的启动,无需任何 map 的动作。但是,Windows 是否存在类似的启动方案?我估计目前是没有的,那就要靠黑客们去 hack 了。
|
|