无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 8491|回复: 16

[讨论] grub命令学习笔记(请ZXW大注释下FD2HD批处理)

[复制链接]
发表于 2012-1-7 11:11:33 | 显示全部楼层 |阅读模式
谢S版解释部分命令。这次请ZXW大帮注释下FD2HD批处理,不少地方不明白。问题见9楼:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=204917&page=1#pid2374248
#1

graphicsmode -1 640:800 480:600 24:32

这个图形模式的命令没有公布具体的参数,红色分辨率部分还有人这样写:100:1000 100:1000 ,不知道是怎么个意思。

#2
calc *0x82b8 && calc *0x82b9&0xff

这两个地址里存放的是什么?
说明书里与启动相关较重要的地址,看了下是 0x8280((bd)) 0x829c(/) 0x82a0(()),嗯,这样说可对?
现在出来的这两个地址是新版启用的?

难道说与ud区有关系?

#3
uuid (hd0,0)

显示类型是 0x0c,指的是FAT格式?0x07是NTFS格式?



#4echo -n | echo -n | echo -n | echo -n
echo经常有些特殊的用法,能讲一下吗?

find --set-root --devices=h /ntldr || find --set-root --devices=h /bootmgr
这个--devices=h 是什么意思?



另外,我的移动硬盘在一联想机器上被识别为软盘,花屏(好像字体未加载)。四主分区,进grub4dos后find到了(fd0)、(fd1),ls (fd0)/ 及 ls (fd1)/ 后能正确显示移动硬盘上前两个主分区文件。手动chainloader (fd0)/grldr重新加载菜单后又好了,执行各菜单项又正常了。
应该怎么处理这种情况来让它不花屏?


初学grub4dos ,看了些教程,还有很多不解。烦请版主及各位过路神仙解惑,多谢!

[ 本帖最后由 2011seeu 于 2012-1-26 14:00 编辑 ]
发表于 2012-1-7 12:31:01 | 显示全部楼层

回复 #1 2011seeu 的帖子

#在所有磁盘类设备的根目录下寻找 ntldr 文件,并将找到的设备设置为根

find --set-root --devices=h /ntldr
回复

使用道具 举报

发表于 2012-1-7 12:39:12 | 显示全部楼层
哈哈 好像我的维护盘就是那么写的。。。
这个图形模式的命令没有公布具体的参数,红色分辨率部分还有人这样写:100:1000 100:1000 ,不知道是怎么个意思。


http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=209#pid2362316
回复

使用道具 举报

 楼主| 发表于 2012-1-7 14:06:53 | 显示全部楼层
原帖由 zhs509 于 2012-1-7 12:39 发表
哈哈 好像我的维护盘就是那么写的。。。


http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=209#pid2362316




谢谢,这一点明白了。
不点做了详细解释,重抄一遍:

抱歉,你这句还有其他疏忽:

graphicsmode -1 800:600 640:480 32

应该这样:

graphicsmode -1 640:800 480:600 24:32

640:800 是控制水平方向的像点个数。不可以颠倒过来,变成 800:640。这是指定范围,小的在前,大的在后。
480:600 控制垂直方向的像点个数,同样不可以颠倒顺序,应该前小后大,表示区间。
24:32 也是有必要的,以免把 4 位的模式 0x102 (它等同于以前的 VGA 0x6A 模式)也包括进来了。

应该首先采用这条命令决定分辨率,分辨率决定之后,再加载图片。这样就不会出错了。黑屏实际上是根本没有进入 VBE 模式的结果,当然不会显示汉字了。

graphicsmode -1 后面不加别的控制参数,竟然会造成黑屏,这可是出乎意料的。如果出现那样的情况,可以认为属于显卡 BIOS 的问题(即显卡 VBE 的问题),无法解决,只有添加别的控制参数,来达到较小的分辨率,使显示器不至于 “ 因为承受不了太大的分辨率 ” 而 “ 罢工 ”。

-------------------

补充研究:

进一步分析:

像这样控制分辨率:

graphicsmode -1 640:800 480:600 24:32

是不是太严格了?假如有些手机之类的设备,分辨率不高,这样控制就太狭窄了。可以考虑这样:

graphicsmode -1 100:1000 100:1000 24:32

这样范围更灵活一些,同时也避免出现很大的分辨率(例如 1024 x 768 )。


这里是不点对图形模式的一些解释:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=235#pid2375749
[quote] graphicsmode 命令兼容 VGA 的 6A 模式,比如graphicsmode -1 命令会在某台机器上探测到三个合法的模式:
128:1B,640x400x24,Direct Color
112:1B,640x480x24,Direct Color
102:1B,800x600x4,Planar
及某些无效模式:
115:1A,800x600x24,Direct Color
这里仅列一个1A,还有若干1B的模式,均非4/24/32位色,亦不为新版本支持。

模式属性 1A 表示,这个模式不被当前硬件支持,即,不被显示器支持。所以,这是个无效的模式。
102:1B,800x600x4,Planr

102 这个模式,属性 1B,表示硬件是支持的。但这个模式就是以前的模式 6A,即,VGA 图形模式 800x600。这个模式也等于是不再被 grub4dos 新版所支持的模式。新版只支持 VBE 图形模式,不再支持 VGA 图形模式。
grub4dos 的 VBE 模式,只支持 24 位和 32 位的色深。所以,在你的图片所显示的模式中,只有两个模式是支持的:
128:1B,640x400x24,Direct Color
112:1B,640x480x24,Direct Color

但是,
如果你加上别的限制,比如,你排除掉 640 的模式,那就只剩下 800x600x4 这个模式了,这是一个不被新版 grub4dos 支持的 VGA 模式。

如果你没有添加任何限制,那么,640x480x24 的乘积是最大的,它就是 graphicsmode -1 命令所选择的最优模式。[/quote]

[ 本帖最后由 2011seeu 于 2012-1-23 14:09 编辑 ]
回复

使用道具 举报

发表于 2012-1-7 17:02:34 | 显示全部楼层

回复 #1 2011seeu 的帖子

#2

0x82b8 和 0x82b9 是和ud启动有关的  具体内容是什么我也不太清楚  我不用fb启动

  只知道如果是grub启动的话  这两个值会是0x0  fb启动的话肯定不为0  也是很多判断fb启动的一个标志

  其他的可以看置顶贴  有介绍
   地址         长度             说明
=========  ==============  ==============================================
0000:8208  4字节(即双字) 启动分区号 install_partition (the boot partition)
0000:8278  4字节(即双字) GRUB4DOS编译的日期十进制数.
0000:8280  4字节(即双字) 启动驱动器号(boot_drive)
0000:8284  4字节(即双字) pxe 客户端 ip (即本地ip)
0000:8288  4字节(即双字) pxe 服务器 ip
0000:828C  4字节(即双字) pxe 网关 ip
0000:8290  8字节(即四字) 最后访问的文件的大小(是执行"cat --length=0"后的文件大小)
0000:8298  4字节(即双字) 可用的扩展内存大小(以 KB 为单位)
0000:829C  4字节(即双字) 当前根分区号(current root partition)
0000:82A0  4字节(即双字) 当前根所在的驱动器(current root drive)
0000:82A4  4字节(即双字) 解压标志 (gzip非自动解压),非0时不自动解压
0000:82A8  8字节(即四字) 最后访问的分区的起始扇区号
0000:82B0  8字节(即四字) 最后访问的分区的扇区总数



#3

0x07 0x0c等这些都是磁盘类型  更常见的写法是ntfs fat32等
                                                 磁盘分区类型标志
00        空,DOS或Windows不允许使用,视为非法        5C        Priam Edisk
01        FAT12                                                     61        Speed Stor
02        XENIX  root                                             63        GNU HURD or Sys
03        XENIX  usr                                               64        Novell Netware
06        FAT16 04 表示分区小于32M                       65        Novell Netware
07        HPFS / NTFS                                            70        Disk Secure Mult
08        AIX                                                         75        PC/IX
09        AIX  bootable                                           80        Old Minix
0A        OS/2  Boot Manage                                   81        Minix/Old Linux
0B        Win95 FAT32                                           82        Linux swap
0C        Win95 FAT32                                           83        Linux
0E        Win95 FAT16                                           84        0s/2 hidden C:
0F        Win95 Extended(大于 8GB)                        85        Linux extended
10        OPUS                                                      86        NTFS volume set
11        Hidden FAT12                                          87        NTFS volume set
12        Compaq diagmost                                     93        Amoeba
16        HiddenFAT16                                           94        Amoeba BBT
14        Hidden FAT16<32MB                                A0        IBM Thinkpad hidden
17        Hidden HPFS/NTFS                                   A5        BSD/386
18        AST Windows swap                                  A6        Open BSD
1B        Hidden FAT32                                          A7        NextSTEP
1C        Hidden FAT32 partition                             B7        BSDI fs
           (using LBA-mode INT 13 extensions)           B8        BSDI swap
1E        Hidden LBA VFAT partition                         BE        Solaris boot partition
24        NEC DOS                                                 C0        DR-DOS/Novell DOS secured partition
3C        Partition Magic                                          C1        DRDOS/sec
40        Venix 80286                                            C4        DRDOS/sec
41        PPC Perp Boot                                         C6        DRDOS/sec
42        NTFS动态分区                            C7        Syrinx
4D        QNX4.x                                                   DB        CP/M/CTOS
4E        QNX4.x 2nd part                                       E1        DOS access
4F        QNX4.x 3rd part                                        E3        DOS r/0
50        OnTrack DM                                             E4        Speedstor
51        OnTrack DM6 Aux                                     EB        BeoS fs
52        CP/M                                                       F1        SpeedStor
53        OnTrack DM6 Aux                                     F2        DOS 3.3+secondary partition
54        OnTrack DM6                                           F4        SpeedStor
55        EZ-Drive                                                  FE        LAN step
56        Golden Bow                                             FF        BBT


#4

这些问题还是先看置顶贴的帮助文档吧  熟悉各个命令的用法再说

#5

识别成fd是最麻烦的情况  这个目前没什么好办法  只能加一堆判断条件  避免这种问题
回复

使用道具 举报

 楼主| 发表于 2012-1-8 22:08:03 | 显示全部楼层
原帖由 mygamexxx 于  2011-9-24 09:58  发表
   请教,关于G4D加载一个菜单文件后,如何在菜单中得到菜单文件的路径。

比如:通过 configfile (hd0,1)/back/menu.lst加载菜单后,如何在菜单中获取菜单文件menu.lst所在的分区(hd0,1)和目录/back/从而设置为变量。

批处理中可以用%~dp0获取,在菜单文件中应该无法使用吧。 ...



C大回答:
原帖由 chenall 于  2011-9-24 09:58  发表
   这个菜单文件的位置一般是固定的。
使用以下命令就可以得到当前加载的菜单。
具体的可以自己看源码。ASM.S里面就可以找到答案。


call Fn.0 0 0x8217 | set menu=

得到的menu变量就是当前使用的菜单文件(上一个configfile命令的参数)

...


旁证:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=191301&page=85#pid2333584
原帖由 sratlf 于  2011-11-7 17:56  发表
@tulongwa

汗  明白怎么回事了  grldr内置菜单没执行过configfile /file命令的话  通过call Fn.0 0 0x8217得到的就是 /menu.lst 这一结果  我一直用这个结果作为第二备用菜单文件使用的

第一备用菜单文件是 menu 指定的  第二备用是这个  第三备用是(md)4+8  这下好处理了

[ 本帖最后由 2011seeu 于 2012-1-8 22:19 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2012-1-8 22:59:57 | 显示全部楼层
查到了ECHO的用法,原来学问很多呀:
echo
用法: echo [-e] [-n] STRING
描述:

(by zhaohj@wuyou)

输出指定内容。

用法:echo [-e] [-n] STRING

-e:允许转义

-n:不换行

不带参数的echo,默认不转义、自动输出换行符。

下面是一些转义符:

\NNN (1到3位)八进制值 NNN 表示的字符
\\ 反斜杠
\a 警报 (声音)
\b 退格符
\f 换页符
\n 换行符
\r 回车符
\t 水平制表符
\v 垂直制表符
\xHH (1到2位)十六进制值为 HH 的字节

增强功能:颜色设置,只支持console模式(文本模式).

使用方法:

echo -P:XXYY $[ABCD]MESSAGE

-P为大写;XX为横坐标,YY为纵坐标。

用$[ABCD]来指定后面显示的字符使用的颜色.

A 值为1时闪烁 (blinking foreground color).

B 值为1时高亮(light)

C [0-7]背景色(background color)

D [0-7]前景色-字体颜色(foreground color)

例子:

1:输出

symmpi
PCI\VEN_1000&DEV_0050

命令:

echo symmpi
echo PCI\VEN_1000&DEV_0050



echo -e symmpi\r\nPCI\\VEN_1000&DEV_0050
#上面\r\n输出回车换行,\\输出\

2:输出

  PCI\VEN_1000&DEV_0050 symmpi
#注意:输出前面有2个空格开头的内容

命令:

echo -e \x20\x20PCI\\VEN_1000&DEV_0050 symmpi
#上面\x20转义后为一个空格
回复

使用道具 举报

发表于 2012-1-9 09:11:15 | 显示全部楼层
感觉没有个详细的官方说明,很不方便
回复

使用道具 举报

 楼主| 发表于 2012-1-18 22:19:42 | 显示全部楼层
刚刚看了ZXW大大的FD2HD批处理,觉得很有意思。试着加点注释,不过有不少地方不懂,请Z大及各位大侠指点。
!BAT
debug 0
checkrange 20111009:-1 read 0x8278 || clear && echo Error: Not supported $[0003]grub4dos version! && exit
#0x8278为grub4dos版本在内存中的地址。
#$[0003] 未解。

calc *0x8280&0xff/2 || debug 1 && command | call :zip_fix *0x8280&0xff= && exit
#由后面的zip_fix子程序可判断 *0x8280&0xff取(bd)设备号。
#计算*0x8280 的值是否为0x80/0x23(fb启动)/0x21(PXE)/0xXX(光驱,更大于硬盘设备号),是则继续,不是就调用zip_fix。
#启动时如果为zip,则为(fd0)或者(fd0,0),此时设备号为0。

calc *0x82b8 && calc *0x82b9&0xff/2 || debug 1 && command | call :zip_fix *0x82b9&0xff=
#如果为UD启动,则判断是否存在(fd0)、(fd0,0)

#0x82b8 、0x82b9与UD有关,具体来讲干什么用的?
#*0x82b9&0xff取(ud)还是可见分区的设备号?

debug 0
exit
:zip_fix
debug 0
setlocal
set /a zip.mod=%1
call :movedisk + || exit
#调用movedisk子程序,才HD号依次后移。
map (%zip.mod%) (hd0) > nul || exit
#加上> nul 屏蔽写屏。

map --hook > nul
map --floppies=0
#既然将FD给形成HD了,最后要去掉FD。

endlocal && call :cpath_fix %zip.mod% %~5
#调用cpath_fix修正路径

clear
exit
:cpath_fix
if "%~d2"=="(fd%1)" command --set-path=(hd0)%~p2 || if "%~d2"=="(fd%1,0)" command --set-path=(hd0,0)%~p2
calc *0x8280-%1 || calc *0x8280=0x80 > nul
#calc *0x8280-%1一定为0,这句可以砍掉吧?

calc *0x82b8 && calc *0x82b9=*0x82b9&0xffffff00|0x80 > nul
#这个红色部分不明白,另外请解释下那个|
calc *0x82a0-%1 || calc *0x82a0=0x80 > nul
exit
:movedisk
set /a hd0=*0x475&0xff+0x7f
if "%hd0%"=="127" exit
if "%1"=="-" || goto :move
map (hd0) (hd-1) > nul
:move
set /a hd1=%hd0%%%1 1
if "%hd1%"=="127" exit
map (%hd0%) (%hd1%) > nul
if "%hd0%"=="128" exit
set /a hd0=%hd0%-1
goto :move

[ 本帖最后由 2011seeu 于 2012-1-18 22:41 编辑 ]
回复

使用道具 举报

发表于 2012-1-19 09:42:57 | 显示全部楼层

回复 #5 sratlf 的帖子

还是期待 sratlf (夜天) 有空更新一下help,一段时间不来感觉又晕了
回复

使用道具 举报

 楼主| 发表于 2012-1-24 15:38:23 | 显示全部楼层
笔记:
color 0x3f 0x3c 0x3 0x3
#分别设置主菜单、选中菜单项、帮助、版本信息的字体颜色;按背景/前景的16进制数来设置。其中0x3其实为0x03,可以简写为 3
#color适用于VBE及文本模式,背景/前景色可使用64位表示法,如#3333ff为一种蓝色,#ff99ff为一种粉色,则0x113333ff11ff99ff表示背景为蓝色/前景为粉色的一种配置。

calc 46<<2+*0x8304
read %@retval% || splashimage /BOOT/GRUB/BACK1.BMP > nul
#如已加载背景,不再重复加

color border 0
#使边框的颜色为0x0(黑色)

font && font ()/BOOT/GRUB/MENU.HEX
#如有字体先卸载再加载/BOOT/GRUB/MENU.HEX为字体

read 0x1800820 || font ()/BOOT/GRUB/MENU.HEX
#如已加载字体,不再重复加载

[ 本帖最后由 2011seeu 于 2012-1-24 15:50 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2012-1-26 15:47:13 | 显示全部楼层
原帖由 2011phzhc 于 2012-1-7 12:31 发表
#在所有磁盘类设备的根目录下寻找 ntldr 文件,并将找到的设备设置为根

find --set-root --devices=h /ntldr



明白了,不是所有磁盘类设备,h特指硬盘(hard disk)。

从P大的0PE内置菜单中可以找到类似用法:
find --devices=uh --set-root /0PE/0PE.ISO && set PEISO=/0PE/0PE.ISO && goto 1 ! echo -n
if exist (0xff)+1 rootnoverify (0xff)
find --devices=cfp --set-root /0PE/0PENB.LZMA && goto 2 ! echo -n

uhcfp分别指UD设备、磁盘、光驱、软驱和PXE网启设备。

[ 本帖最后由 2011seeu 于 2012-1-26 22:15 编辑 ]
回复

使用道具 举报

发表于 2012-1-26 16:28:25 | 显示全部楼层

回复 #12 2011seeu 的帖子

u指ud,即fbinst,不是usb device,这些在置顶贴都有
回复

使用道具 举报

 楼主| 发表于 2012-1-26 22:16:17 | 显示全部楼层
谢S版,受益非浅
回复

使用道具 举报

发表于 2012-2-1 09:17:39 | 显示全部楼层
原帖由 2011seeu 于 2012-1-18 22:19 发表
:cpath_fix
if "%~d2"=="(fd%1)" command --set-path=(hd0)%~p2 || if "%~d2"=="(fd%1,0)" command --set-path=(hd0,0)%~p2
calc *0x8280-%1 || calc *0x8280=0x80 > nul
#calc *0x8280-%1一定为0,这句可以砍掉吧?

calc *0x82b8 && calc *0x82b9=*0x82b9&0xffffff00|0x80 > nul
#这个红色部分不明白,另外请解释下那个|

>>#calc *0x8280-%1一定为0
非0的情况或许有,未碰到不等于没有。

>>calc *0x82b9=*0x82b9&0xffffff00|0x80
&与|是按位运算符,请阅读置顶的手册。
这里的用途是改0x82b9处字节为0x80,其它保持不变。

[ 本帖最后由 zxw 于 2012-2-1 09:26 编辑 ]
回复

使用道具 举报

发表于 2012-8-5 22:23:44 | 显示全部楼层
graphicsmode用法: graphicsmode [-1 | 0x12 | 0x6A]
描述:

display/set the graphics mode number for the next graphics init.return the currentgraphics mode setting.
参数值为 -1 时,表示使用 vbe 显示模式。参数值为0x12或0x6A,表示使用 vga 显示模式。推荐使用 vbe 显示模式。

[ 本帖最后由 shaohua 于 2012-8-5 23:12 编辑 ]
回复

使用道具 举报

发表于 2012-8-5 22:25:35 | 显示全部楼层
使用 vbe 模式:
graphicsmode -1 参数1 参数2 参数3
参数1 为指定分辨率宽度,可以使用具体数值,也可以使用一个范围值。
参数2 为指定分辨率高度,可以使用具体数值,也可以使用一个范围值。
参数3 为指定位色,可以是具体数值,也可以使用一个范围值。


[ 本帖最后由 shaohua 于 2012-8-5 23:12 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-28 20:52

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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