|
|
发表于 2014-1-23 18:07:08
|
显示全部楼层
本帖最后由 wuwuzz 于 2014-1-23 18:11 编辑
5年了,物是人非,感慨万千。近日,zbkh发出了内容类似LZ的求助帖,
我回来订正、完善本帖,留给后来者。
2008年以后,我研究了众多资料(包括流出的BIOS USB源代码),基本解决了
遗留问题,在认识上、实践上都取得了重要进展,可以做总结和收官了。
================================================================
一、2#的h8jyuq说法是正确的。
二、4#的netwinxp老师贡献最大。其大部分观点都是正确的,需要订正和说明的
有以下几点:
(一)关于Mode Sense命令media type的认识是错误的。media type确定的是:
USB-FDD中,如何区分360K、720K、1.2M、1.44M..等不同容量的软盘,而不是
USB-FDD/ZIP/HDD如何判定、区分。
(二)那么,BIOS如何区分U盘为USB-FDD/ZIP/HDD,或者说判定依据是什么呢?
1、不同的BIOS有不同的算法,没有统一的模式。
一般情况下,BIOS不依赖某一个参数来区分,而是参考多个参数进行计算,
根据综合计算出来的结果进行判定。
特殊情况下,BIOS汇编源码提供编译选项,如果开启了编译选项,则生成的
可执行BIOS代码就有可能依赖某一个参数判定FDD/HDD。
2、最重要的参数,就是“总扇区数(容量)”。这是不同BIOS(AMI和Phoenix)都
采信的相同依据。总扇区数(容量)的取得,由BIOS发命令,U盘固件执行命令并
反馈给BIOS。
3、辅助依据,不同的BIOS各不相同,例如:
Phoenix BIOS会发出ZIP驱动器专用命令,把命令返回码0或1,当作1个二进制位
参与计算。AMI BIOS则没有类似的做法。
(三)关于UFI指令集
UFI指令集最初是针对USB-FDD发布的,现实中,U盘固件指令集取值一般都是
SCSI,很少是UFI。
但是,由于UFI是SCSI的变形子集,而且,SCSI指令集太庞杂,根本不可能得到
真正完整实现,所以,U盘的实际情况是:声称是用SCSI指令集,实际上用UFI
指令集是可以的。至于USB启动,掌握UFI就够用了,需要了解更多的背景知识时,
再参考SCSI。
三、14#是4年前我自己的疑问,给出解答,留给后来者:
(一)在POST阶段,BIOS有自己的内置USB驱动,UFI命令可以使用。
(二)PNP扩展头,BIOS在构造可选启动设备菜单时要用到,与上述
USB FDD/ZIP/HDD判定不是一回事。 |
|