无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4495|回复: 14
打印 上一主题 下一主题

[求助] 极速版中grub菜单语句智能处理问题

[复制链接]
跳转到指定楼层
1#
发表于 2013-4-30 10:30:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zds1210 于 2013-4-30 10:56 编辑

最近在 研究极速版的各种部署方法的统一,找到了一种空间换时间的方法来解决量产版和 U+B隐藏版时极速版统一的问题。但菜单要更新一下。请高手帮助一下。
思路是这样子的,一级内核解开,在光盘量产版中二级内核也解开直接用,在U+B+隐藏版中再保留了一份打包的二级内核来直接map。这样子量产和U+B+隐藏时候都可以极还启动了。但菜单就不统一了。
光盘量产版中,一二级内核都解开了,也不用什么map,怕引起兼容性问题,菜单这样子写:
title 4.运行Win 2003 PE极速版  (CD)
echo $[1106] loading win2003 mini pe, please wait ...
chainloader ()/WXPE/MNPESLDR.BIN || find --set-root /WXPE/MNPESLDR.BIN && chainloader /WXPE/MNPESLDR.BIN

但在U+B+隐藏后,菜单要这样子写:
title 4.运行Win 2003 PE极速版   (NOCD)
echo $[1106] loading win2003 mini pe, please wait ...
map ()/winpe/nv03two.ISO (0xfa) || find --set-root /winpe/nv03two.ISO && map /winpe/nv03two.ISO (0xfa)
map --e820cycles=3
map --hook
chainloader ()/WXPE/MNPESLDR.BIN || find --set-root /WXPE/MNPESLDR.BIN && chainloader /WXPE/MNPESLDR.BIN
现在想在机子中,智能处理一下,自动判断环境,统一加载菜单,有办法吧?

   
试着用这个语句,不知道有问题没有:
title 4.运行Win 2003 PE极速版   
echo $[1106] loading win2003 mini pe, please wait ...
set bd=hd
checkrange 0x9f read 0x8280 && set bd=cd
if %bd%==cd chainloader (cd)/WXPE/MNPESLDR.BIN && boot
map ()/winpe/nv03two.ISO (0xfa) || find --set-root /winpe/nv03two.ISO && map /winpe/nv03two.ISO (0xfa)
map --e820cycles=3
map --hook
chainloader ()/WXPE/MNPESLDR.BIN || find --set-root /WXPE/MNPESLDR.BIN && chainloader /WXPE/MNPESLDR.BIN
2#
发表于 2013-4-30 10:56:46 | 只看该作者
欢迎各方专家老师批评指正!

先行占楼支持
回复

使用道具 举报

3#
发表于 2013-4-30 13:05:12 | 只看该作者
我对于许多应用方面的问题不太熟悉,也帮不上忙。

只是看到如下的代码,觉得有问题:

checkrange 0x9f read 0x8280 && set bd=cd

你显然假定,BIOS 都是用 0x9f 作为光盘盘号的。

但这个假定是不成立的。

不同的 BIOS 会使用不同的光盘盘号。从 0x80 至 0xFF 都是有可能的。

另外,由于 DOS 历史的原因,传统的启动盘只有两个:一个是软盘 0x00,另一个是硬盘 0x80。后来出现了 no-emulation 模式的光盘启动规范,通常情况下,启动光盘的盘符应该在 0x81 至 0xFF 的范围之中。如果没有硬盘,那么光盘也有可能占据 0x80 这个盘符。但是实际上恐怕没有 BIOS 用这个 0x80 当作光盘盘符,至少还没发现这样的案例。

所以,判断启动盘是否光盘,可以用 “是否大于 0x80” 作为判断的条件。

因此,我觉得你的代码可以改进如下:

checkrange 0x81:0xFF read 0x8280 && set bd=cd

只是个人见解,不一定都对。你可以自己搜索网络,然后作出自己的判断。

回复

使用道具 举报

4#
发表于 2013-4-30 13:16:00 | 只看该作者
title 4.运行Win 2003 PE极速版  (CD)
echo $[0xB6] loading win2003 mini pe, please wait ...
if "%@root%"=="(cd)" if not exist /winpe/nv03two.ISO && find --set-root /winpe/nv03two.ISO
if "%@root%"=="(cd)" && map /winpe/nv03two.ISO (0xfa) &; map --e820cycles=3
if "%@root%"=="(cd)" && map --hook
if not exist /WXPE/MNPESLDR.BIN && find --set-root /WXPE/MNPESLDR.BIN
chainloader ()/WXPE/MNPESLDR.BIN
回复

使用道具 举报

5#
 楼主| 发表于 2013-4-30 13:29:21 | 只看该作者
谢谢楼上两位的评定,相当的给力,能够解决我的许多问题。
回复

使用道具 举报

6#
 楼主| 发表于 2013-4-30 13:30:44 | 只看该作者
本帖最后由 zds1210 于 2013-4-30 14:41 编辑

if "%@root%"=="(cd)" && map /winpe/nv03two.ISO (0xfa) &; map --e820cycles=3
红色部分是否有错误啊?

if "%@root%"=="(cd)"又是什么意思啊?意思是cd启动吧?我的意思是cd时候不用map了。看来前面应该加下not
另外大师的语句,能不能换成iftitle语句,可以简洁一些?
回复

使用道具 举报

7#
 楼主| 发表于 2013-4-30 13:37:18 | 只看该作者
不点 发表于 2013-4-30 13:05
我对于许多应用方面的问题不太熟悉,也帮不上忙。

只是看到如下的代码,觉得有问题:

谢谢你的指正,我这里的cd,还包括量产为usb-cdrom,代码要怎么改进啊?大师指点相当给力啊。哈哈。

点评

我就在这里简单回复一下。USB-CDROM 在 BIOS 看来就是一个 CDROM 而已。无需特别处理。在启动时,BIOS 都是给它赋予一个位于 0x81 至 0xFF 之间的光盘盘号。BIOS 与具体的介质无关,统一使用 int13 接口来访问设备。  发表于 2013-4-30 16:44
回复

使用道具 举报

8#
 楼主| 发表于 2013-4-30 15:00:26 | 只看该作者
本帖最后由 zds1210 于 2013-4-30 15:03 编辑

最近弄出两种法子,大师看一下有没有问题:
一、按照不占大师的指定:
title 4.运行Win 2003 PE极速版   
echo $[1106] loading win2003 mini pe, please wait ...
set bd=hd
checkrange 0x9f read 0x8280 && set bd=cd
if %bd%==cd chainloader (cd)/WXPE/MNPESLDR.BIN && boot
map ()/winpe/nv03two.ISO (0xfa) || find --set-root /winpe/nv03two.ISO && map /winpe/nv03two.ISO (0xfa)
map --e820cycles=3
map --hook
chainloader ()/WXPE/MNPESLDR.BIN || find --set-root /WXPE/MNPESLDR.BIN && chainloader /WXPE/MNPESLDR.BIN
二是按照超级版主的指定:
title 4.运行Win 2003 PE极速版
echo $[1106] loading win2003 mini pe, please wait ...
if "%@root%"=="(cd)" chainloader ()/WXPE/MNPESLDR.BIN && boot
map ()/winpe/nv03two.ISO (0xfa) || find --set-root /winpe/nv03two.ISO && map /winpe/nv03two.ISO (0xfa)
map --e820cycles=3
map --hook
chainloader ()/WXPE/MNPESLDR.BIN || find --set-root /WXPE/MNPESLDR.BIN && chainloader /WXPE/MNPESLDR.BIN

回复

使用道具 举报

9#
发表于 2013-4-30 16:50:20 | 只看该作者
zds1210 发表于 2013-4-30 13:30
if "%@root%"=="(cd)" && map /winpe/nv03two.ISO (0xfa) &; map --e820cycles=3
红色部分是否有错误啊?
...

没有错误  需要用最新版grub4dos

if和iftitle是两种不同情况下用的  除非要写两个菜单
回复

使用道具 举报

10#
发表于 2013-4-30 16:51:07 | 只看该作者
除了在 3 楼我已经提到的问题以外,我目前还看不出还有什么别的问题。

也可以先让大家投入使用,看看能不能暴露出问题来。

回复

使用道具 举报

11#
发表于 2013-4-30 18:37:17 | 只看该作者
本帖最后由 sunsea 于 2013-4-30 18:39 编辑
zds1210 发表于 2013-4-30 15:00
最近弄出两种法子,大师看一下有没有问题:
一、按照不占大师的指定:
title 4.运行Win 2003 PE极速版    ...


似乎用%@root%来弄有些问题
可能启动时的%@root%不是(cd)而是(cd0)

我的code:
  1. title 4.运行Win 2003 PE极速版   
  2. echo $$[1106] loading win2003 mini pe, please wait ...
  3. set bd=hd
  4. checkrange 0xa0:0xff read 0x8280 && set bd=cd
  5. if %bd%==cd chainloader (cd)/WXPE/MNPESLDR.BIN && boot
  6. map ()/winpe/nv03two.ISO (0xfa) || find --set-root /winpe/nv03two.ISO && map /winpe/nv03two.ISO (0xfa)
  7. map --e820cycles=3
  8. map --hook
  9. chainloader ()/WXPE/MNPESLDR.BIN || find --set-root /WXPE/MNPESLDR.BIN && chainloader /WXPE/MNPESLDR.BIN
复制代码
回复

使用道具 举报

12#
发表于 2013-4-30 19:52:59 | 只看该作者
启动时是没有 (cd0) 的。只可能有 (cd)。

(cd0) 是由 cdrom --init 命令创建的。由于 cdrom --init 并非能够在所有的机器上成功运行,因此,(cd0) 也就不通用了。



回复

使用道具 举报

13#
 楼主| 发表于 2013-4-30 20:03:44 | 只看该作者
谢谢各位的指点,基本上已经找到了解决问题的方法,,现在就是要测试一下,哪个命令通用性强一些。
回复

使用道具 举报

14#
发表于 2013-4-30 20:46:53 | 只看该作者
不点 发表于 2013-4-30 19:52
启动时是没有 (cd0) 的。只可能有 (cd)。

(cd0) 是由 cdrom --init 命令创建的。由于 cdrom --init 并非 ...

感谢指点!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

15#
发表于 2013-5-1 15:59:09 | 只看该作者
既然谈到这个话题,就顺便补充一些相关的内容。

首先,从光盘(或 USB-CDROM)启动的时候,是 BIOS 给光盘(或 USB-CDROM)赋予了一个 int13 盘号,这样,我们的 grub4dos 和 syslinux 以及 DOS 下的 eltorito.sys 才有可能调用 BIOS 的 int13 这个子程序来访问光盘(或者 USB-CDROM)上的内容。

其次,不同的 BIOS 的 “偏好” 也不同。光盘盘号可能在 0x81 和 0xFF 之间变化。

第三,当 grub4dos 成功探测到这个光盘号码的时候,grub4dos 会记住这个盘号的值,并且让 (cd) 设备访问这个光盘,也就是说,让 (cd) 指向那个光盘号码。

第四,由于光盘号码在 0x81 至 0xFF 之间变化,所以,探测它也不是一件 “简单透顶” 的事。不同的软件采用的探测方法也是有差异的。时空论坛 wuwuzz 的报告很典型:

http://bbs.znpc.net/forum.php?mod=viewthread&tid=6762

这个报告说明了,探测 BIOS 的光盘号码不是一件很轻松的事情。探测错误、探测失败,都是有可能的。主要原因是,BIOS 不遵守业界制定的相关规范。

第五,联系到 pxe 启动的情况。PXE 不同于光盘。光盘(或USB-CDROM)是属于 int13 设备。但 PXE 设备就不是 INT13 设备了。BIOS 没有为 pxe 设备提供 int13 接口。grub4dos 用自己的驱动程序(这是 bean 写的代码)来访问 pxe 的介质,并且赋予 pxe 设备一个设备号码 (pd),其数值是一个固定的值,即 (0x21)。这并非是一个软盘,而是特别用来表示 PXE 设备的一个 grub4dos 设备号。BIOS 中没有这个设备号,是 grub4dos 赋予它的设备号。这个 pxe 设备不具有 int13 接口。所以,pxe 设备是很特殊的,它比普通的磁盘和光盘处理起来要麻烦一些。比如说,磁盘、光盘有 “扇区” 概念,而 pxe 设备就没有扇区概念,只有 “文件” 的概念。由此进一步引出其他很多本质的差别,比如,PXE 设备没有 MBR、PBR 之类的概念。

第六,grub4dos 中的设备号是一个 4 字节的整数。普通的 BIOS 盘号是一个单字节的值。所以,grub4dos 的设备号能够涵盖 BIOS 的盘号。那些 BIOS 不使用的磁盘号码,都可以被 grub4dos 用于别的目的。比如说,BIOS 不使用 0x21 这个盘号,那么 grub4dos 就用这个盘号来表示 pxe 设备,即 (pd)。再比如,grub4dos 的 (md) 设备,它所使用的 grub4dos 设备号是 0xFFFF,这就超出单字节的范围了,BIOS 的盘号是不可能有这么大的,最大的 BIOS 盘号是 0xFF。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-1-11 20:03

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表