无忧启动论坛

标题: 求解grldr内置菜单中0x82b9含义 [打印本页]

作者: 201287zr    时间: 2021-8-4 16:17
标题: 求解grldr内置菜单中0x82b9含义
本帖最后由 201287zr 于 2021-8-4 16:21 编辑

最近正在学习grub4dos,看到grldr内置菜单中有这么一句不知什么作用:

if "%@root%"=="(ud)" && calc *0x82A0=*0x82b9&0xff


其中查了grub4dos中readme.txt以及搜了下论坛关于0x82B9的解释,并没有任何发现,不知道0x82b9是什么?

下面是README_GRUB4DOS_CN.txt中找到的其它固定位置内部变量的定义,但未见到0x82b9,只有0x82b8

******************************************************************************
***               在固定位置访问一些内部变量                               ***
******************************************************************************

地址            长度            说明
=========    ========    ==============================================
0000:8208    4字节(即双字) 启动分区号 install_partition (the boot partition)
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字节(即双字) 从 1M 开始的连续内存块的大小(以 KB 为单位)
0000:829C    4字节(即双字) 当前根分区号(current root partition)
0000:82A0    4字节(即双字) 当前根所在的驱动器(current root drive)
0000:82A4    4字节(即双字) 解压标志 (gzip非自动解压),非0时不自动解压
0000:82A8    8字节(即四字) 最后访问的分区的起始扇区号
0000:82B0    8字节(即四字) 最后访问的分区的扇区总数
0000:82B8    4字节(即双字) UD分区:磁头数,每磁道扇区数,真正驱动器号,最大每磁道扇区数(低位)
0000:8278    4字节(即双字)  GRUB4DOS编译的日期十进制数.
0000:82c0    8字节(即四字) 从 4G 开始的连续内存块的大小(以 KB 为单位)
=======

然后我实际操作查看了下0x82b9的值,但显示的是一个较大的数,如下图所示:*0x82b9=335051532(16进制为0x1FF3F80
那么*0x82b9&0xff得到的值应该是0x80,也就是*0x82A0=0x80,代表当前根驱动设备是hd0。
但0x82B9代表的整个含义是什么呢?是每次低位都是0x80吗?,高位又代表什么含义呢?



不知chenall大神、不点大师、yaya大佬,可否指点一二,能否在更新说明中完善一下相关含义说明呢?
望各位论坛大哥指点一下。



作者: 2011yaya2007777    时间: 2021-8-4 16:49
0x82b9是ud启动时的盘符。bios识别为硬盘时,为0x80 。识别为软盘时,为0。
作者: plusv    时间: 2021-8-4 16:56
依你的讯息,
用直觉猜的.

0000:82B8    4字节(即双字) UD分区:磁头数,每磁道扇区数,真正驱动器号,最大每磁道扇区数(低位)
0000:82A0    4字节(即双字) 当前根所在的驱动器(current root drive)

*0x82A0=*0x82b9&0xff
当前根所在的驱动器=0x80=hd0

82B8 4字节
表示:
82B8 磁头数
82B9 每磁道扇区数
82BA 真正驱动器号
82BB 最大每磁道扇区数(低位)



作者: 201287zr    时间: 2021-8-4 17:01
2011yaya2007777 发表于 2021-8-4 16:49
0x82b9是ud启动时的盘符。bios识别为硬盘时,为0x80 。识别为软盘时,为0。

感谢yaya大佬 回复。ud启动时的盘符是什么意思?以上面的为例,*0x82b9=335051532(16进制为0x1FF3F80),那高位0x1FF3F有没有具体含义呢(代表什么)?
作者: 201287zr    时间: 2021-8-4 17:23
plusv 发表于 2021-8-4 16:56
依你的讯息,
用直觉猜的.

这样理解好像不对,以上面为例,*0x82b9=0x1FF3F80,我又试了下*0x82b8=0x1FF3F803F
对比发现,0x80代表的应是“真正驱动器号”,那高位的0x1FF3F,应分别代表“磁头数”、“每磁道扇区数”,但发现0x82B8是4字节,实际操作中得出的0x1FF3F803F明显是5个字节,对比后得出0x1FF3F803F:3F代表“每磁道扇区数”、“FF是磁头数”?那高位的0x1是什么鬼?
作者: 201287zr    时间: 2021-8-4 17:30
plusv 发表于 2021-8-4 16:56
依你的讯息,
用直觉猜的.

这样理解好像不对,以上面为例,*0x82b9=0x1FF3F80,我又试了下*0x82b8=0x1FF3F803F
对比发现,0x80代表的应是“真正驱动器号”,那高位的0x1FF3F,应分别代表“磁头数”、“每磁道扇区数”,但发现0x82B8是4字节,实际操作中得出的0x1FF3F803F明显是5个字节,对比后得出0x1FF3F803F:3F代表“每磁道扇区数”、“FF是磁头数”?那高位的0x1是什么鬼?
作者: plusv    时间: 2021-8-4 17:32
201287zr 发表于 2021-8-4 17:23
这样理解好像不对,以上面为例,*0x82b9=0x1FF3F80,我又试了下*0x82b8=0x1FF3F803F
对比发现,0x80代表 ...

我是依你的讯息解读的.

如果 格式 是 4 字节就不会得到 5 字节,
你要依格式取得每个字节的意思.

另外
*0x82b9=0x1FF3F80
*0x82b8=0x1FF3F803F
*0x82b8=3F
*0x82b9=80
作者: 201287zr    时间: 2021-8-4 17:33
本帖最后由 201287zr 于 2021-8-4 17:39 编辑
plusv 发表于 2021-8-4 16:56
依你的讯息,
用直觉猜的.

这样理解好像不对,以上面为例,*0x82b9=0x1FF3F80,我又试了下*0x82b8=0x1FF3F803F
对比发现,0x80代表的应是“真正驱动器号”,那高位的0x1FF3F,应分别代表“磁头数”、“每磁道扇区数”,但发现0x82B8是4字节,实际操作中得出的0x1FF3F803F明显是5个字节,对比后得出0x1FF3F803F:3F代表“最大每磁道扇区数”、“每磁道扇区数”?那高位的0x1FF是什么鬼?0x1代表的是磁头数,还多个字节出来,还是0x82b8不是4个字节?搞不懂
综上分析,我觉得0x82b9,如实际值为0x1FF3F803F,代表的意思可能是“0x1磁头数、0x3F每磁道扇区数、0x80真正驱动器号、0x3F最大每磁道扇区数(低位)”,但多出来的字节FF不知怎么理解。

作者: plusv    时间: 2021-8-4 17:36
本帖最后由 plusv 于 2021-8-4 17:45 编辑
201287zr 发表于 2021-8-4 17:33
这样理解好像不对,以上面为例,*0x82b9=0x1FF3F80,我又试了下*0x82b8=0x1FF3F803F
对比发现,0x80代表 ...

>我觉得0x82b9,如实际值为0x1FF3F803F

你不可这样解读,
你要解读 1 个字节.

0x82b9=3F.

PS:
>"我觉得0x82b9,如实际值为0x1FF3F803F"
意义是
0x82b8=?? 磁头数
0x82b9=3F 每磁道扇区数
0x82ba=80 真正驱动器号
0x82bb=3F 最大每磁道扇区数(低位)
0x82bc=FF
0x82bd=01



作者: 201287zr    时间: 2021-8-4 17:57
plusv 发表于 2021-8-4 17:36
>我觉得0x82b9,如实际值为0x1FF3F803F

你不可这样解读,

谢谢指点,我再实际操作了下,是这样的:
calc *0x82b8=0x1FF3F803F
calc *0x82b9=0x1FF3F80
calc *0x82ba=0x1FF3F
calc *0x82bb=0x1FF
calc *0x82bc=0x1
只能看出具体含意的脉络,大概的意思该是差不多了,但0x1FF特别是0xFF的指向不明,一般磁头数为1是合理的,不会是255。FF应有特殊含义吧,而5个地址的字节数不一样,是程序内存就是这样吗?没有固定字节大小吗?我不懂编程,不知道是不是bug。
作者: plusv    时间: 2021-8-4 18:06
201287zr 发表于 2021-8-4 17:57
谢谢指点,我再实际操作了下,是这样的:
calc *0x82b8=0x1FF3F803F
calc *0x82b9=0x1FF3F80

我很久没用 Grub4Dos 了,

如果有类似 Debug 的 Dump 语法就很容易懂了.



作者: captain_g    时间: 2021-8-5 08:30
就是 和 0xff 进行“按位与”运算
看结果为多少




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