无忧启动论坛

标题: 请教wintoflash大佬,纯UEFI/grub2环境中,U盘CHS参数是否不可或缺。 [打印本页]

作者: wuwuzz    时间: 2020-8-7 11:29
标题: 请教wintoflash大佬,纯UEFI/grub2环境中,U盘CHS参数是否不可或缺。
我在以往的学习中,得知:

1、在USB启动规范中,是要求U盘固件提供CHS参数,作为CHS-LBA转换计算的基础;
2、与规范紧密相关,在BIOS环境下,已经流出的BIOS源码表明,U盘固件要提供CHS
参数,作为构造INT13 Fn服务的计算前提(即使将来引导软件-如G4D-不用CHS方式访问
U盘,BIOS照样要提前计算,等待被调用)
3、UEFI环境下,我看到流出的UEFI源码片段有与U盘CHS关联的内容,但不清楚这些代码
是否是CSM环境专用。(因为源码太庞杂,要求的知识储备很高,我没有能力了解全貌)

现在想请教的是:
纯UEFI环境(/GRUB2)下,U盘CHS参数是否不可或缺。
无论是与否,结论出处是来源于某个规范要求? 抑或是解决某个问题时所需前提基础?
如果您有时间,望不吝赐教,十分感谢!


作者: wintoflash    时间: 2020-8-7 15:54
UEFI 只是规定了固件向启动程序/操作系统提供的接口,并没有规定固件内部是如何实现这些东西的。理论上在 Linux/DOS/grub 上把这些接口都实现一遍那也能叫 UEFI。
至于读写磁盘方面的接口,当然是不用 CHS 的,但是内部实现是什么样那就不一定了。

平台固件内部的具体实现,是由 PI (Platform Initialization) 来规范的。
PI 规范可以从这里下载:https://uefi.org/sites/default/f ... _7_A_final_May1.pdf
但是,实际上很多东西都不在 PI 规范里面,比如 CSM。
PI 的规范我只看了很少一部分,因为用不到。但是据我印象中,PI 规范好像也没有明确规定磁盘必须满足什么要求。

开源的 UEFI 实现,比如最常用的 edk2,内部应该是不需要 CHS 的,CSM 部分似乎也不需要 (这个我不太清楚)。


作者: wuwuzz    时间: 2020-8-8 10:01
本帖最后由 wuwuzz 于 2020-8-8 12:17 编辑

谢谢wintoflash大佬!我看了PDF文档,又对照有兴趣的代码片段揣摩了一番,

您的想法很对:
“PI规范没有明确规定磁盘必须满足什么要求...
读写磁盘方面...内部实现是什么样那就不一定了。”

现在可以进一步了,内部实现是需要CHS的。从流出的代码看,
内部的大致情况是,USB存储设备驱动涉及2个层面:

一、efiusbmass
EFI USB Mass Storage Driver,作用是:Installs BlkIo protocol on a USB Mass Storage device

二、usbmass
USB Mass Storage support implementation,并作为runtime存在

这里有许多重要的子过程:
USBMass Identify DeviceType()、 USBMass Get Device Parameters()、
USBMass Check Device Ready()、 USBMass Update Device Geometry()等,
与CHS有千丝万缕的联系,   尤其是USBMass Update Device Geometry()。

在这里,C*H*S被用作计算MaxLba(总扇区数)的方法之一。

并且,MaxLba还会在Install BLOCK_IO protocol时被引用,如下
MassDev->Media->LastBlock = DevInfo->dMaxLba-1;   // LastBlock is 0-based








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