无忧启动论坛

标题: 请教菜单文件的几个命令及写法? [打印本页]

作者: icevan    时间: 2013-5-17 15:45
标题: 请教菜单文件的几个命令及写法?
本帖最后由 icevan 于 2013-5-17 23:32 编辑

我设想是PXE和普通启动共用一个MENU.LST。
使用iftitle在不同的环境下显示不同的菜单。
简单的判断比如:
iftitle [if not "%?_BOOT%"=="(pd)"] pe \n
是可以的。
现在我想在加一条判断,如果内存小于524K也不显示。
这该怎么写呢?

iftitle [if not "%?_BOOT%"=="(pd)"] . 运行 Native Win03  PE
   /BOOT/GRUB/F6IMG   
   echo $[0005]Loading Native Windows2003 PE , Please Wait ...
   pause --wait=1
   chainloader /BOOT/LDRNV03.BIN

title . 运行 Windows 8 PE X86
   if "%?_BOOT%"=="(pd)" pxe keep && chainloader --raw (pd)/BOOT/PXEMGR.0 && boot
   chainloader /BOOT/BOOTMGR

iftitle [判断可用内存大于524K] . 运行 Win03 PE  内置版  
  ()/BOOT/GRUB/F6IMG
   echo $[0005]Loading Windows2003 PE , Please Wait ...
   pause --wait=1
   if "%?_BOOT%"=="(pd)" pxe keep && chainloader --raw (pd)/BOOT/PXE03PE.0 && boot
   chainloader /BOOT/LDR03PE

iftitle [必须从PXE启动,并且可用内存小于524K] . 运行 Win03 PE  内置版  
  ()/BOOT/GRUB/F6IMG
   pxe keep
   map --mem (pd)/BOOT/WINPE.ISO (0xfe)
   map --mem (pd)/BOOT/TOOLS.ISO (0xff)
   map --rehook
   pxe unload
   chainloader (0xfe)/WXPE/SETUPLDR.BIN

因为有机器通过PXE启动后可用内存不够524K。这样我先MAP服务器上的镜像文件到本地。
然后卸载PXE内存,再启动镜像内的PE。

上面菜单方括号内的该怎么写才对?
作者: sratlf    时间: 2013-5-17 16:23
判断物理内存大于524k可以用 checkrange 525:-1 read 0x8298

不过猜测lz想得到的是低端可用内存是否大于524k  可以用displaymem命令  里面的Lower Memery就是低端可用内存
作者: icevan    时间: 2013-5-17 16:44
现在新版本直接显示了低端内存。
只是不太懂checkrange 525:-1这是什么意思?

作者: icevan    时间: 2013-5-17 16:50
我看到zhaohj 大侠是这样判断的。
checkrange 524:-1 calc *0x413 & 0xffff
作者: 不点    时间: 2013-5-17 17:09
本帖最后由 不点 于 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 了。


作者: 不点    时间: 2013-5-17 17:13
本帖最后由 不点 于 2013-5-17 17:15 编辑
icevan 发表于 2013-5-17 16:50
我看到zhaohj 大侠是这样判断的。
checkrange 524:-1 calc *0x413 & 0xffff


这个办法挺好的。我还停留在 read 命令上了。看来 calc 可以取代 read 命令了。

常规内存不可能超过 640K,所以,下面的写法更好一些:

checkrange 524:640 calc *0x413 & 0xffff


作者: icevan    时间: 2013-5-17 18:45
iftitle [checkrange 525:640 calc *0x413 & 0xffff]  . 运行 Win03 PE  内置版
常规内存在524至640之间,这条菜单就显示。
普通启动几乎不会有低于524K的时候,在PXE启动下就有可能低于524K。这时也不显示这条菜单。

iftitle [if "%?_BOOT%"=="(pd)" && checkrange 0:525 calc *0x413 & 0xffff]  . 运行 Win03 PE  内置版
如果不是PXE启动就不显示这条,是PXE启动就在检查常规内存是不是小于524K,都成立就显示这条菜单。

这样写有没有问题?
对checkrange大概有个了解了。不过这个524:-1里的"-1"就搞不懂了。按我的理解 x:y 这表示的是一个范围。
那就该像0:100这样表示从0到100的范围。
基础知识太差,问题都有点低级,还希望解惑。
虚拟机下不好做测试,就只有问问大家了。



作者: icevan    时间: 2013-5-17 20:55
本帖最后由 icevan 于 2013-5-17 20:57 编辑
不点 发表于 2013-5-17 17:09
不是早就说过,低端常规内存的大小(以 K 为单位)是以 0x413 处的 2 字节整数为准吗?这是 BIOS 规范,非常 ...


我遇到一个机器。PXE启动后只有504K内存。这样就算不使用MAP也无法启动PE。
测试MAP一个ISO镜像过来。开始pxe unload。直接启动这个镜像里的PE,可以正常启动了。
然后直接启动这个镜像GRUB4DOS显示内存为600多K。grldr做的光盘引导。
后来我没有pxe unload。启动后显示可用内存也是600多K。正常启动PE
看帮助文档里说 “GRUB4DOS的默认退出时自动卸载pxe strack”。看来pxe unload可以不用了。

至于pxe unload会死机的,我还准备了一套PXELINUX的环境,只是不知道在PXELINUX的环境下怎么看
可用内存。好像占用小点。同样的机器PXELINUX可以正常启动。只是没g4d灵活。


作者: 不点    时间: 2013-5-17 22:06
icevan 发表于 2013-5-17 18:45
iftitle [checkrange 525:640 calc *0x413 & 0xffff]  . 运行 Win03 PE  内置版
常规内存在524至640之间, ...

checkrange 的参数是表示数值范围的。525:640是不包括524的,因此,正确的范围应该是524:640。另外负的1常常用来表示最大的整数。你的0:525显然也不是你想要的,你实际想要的是0:523。
作者: icevan    时间: 2013-5-17 23:31
谢谢楼上朋友的指点。
刚刚在虚拟机里实验了下。可以达到我想要的效果。






欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3