|
以下纯属个人理解,细节部分请上网下载Universal Serial Bus Mass Storage Class UFI Command Specification标准文档(PDF格式)。
BIOS通过USB总线(2.0的是通过EHCI USB)向USB存储设备发送UFI指令来和它进行交流的。
其中MODE SENSE Command(5AH)就是你所说的媒体介质、模式检测功能,在返回的数据包中包含了一个Media Type and Write Protect块里面有介质描述符的字节(该字节在格式化的UFI命令包中可以指定),BIOS就是根据这个来确认U盘的类型和是否有写保护等。
系统对USB存储设备访问是采用一种叫LBA的地址(目前采用的是LBA28),并没有所谓的CHS,windows、linux等访问USB存储设备的时候并不使用BIOS的INT 13H,而是通过USB总线直接发UFI命令包,采用的地址也是LBA,所以就不太存在兼容性问题。
然而U盘启动引导程序确是依靠BIOS的INT 13H来访问。
BIOS的INT 13H对U盘的支持(不一定支持),就是把INT 13H中的C、H、S参数转化成LBA地址,然而不同的BIOS设定的每道扇区数、每头柱面数并不一定相同。假设我们有个U盘在自己机子的BIOS被认成16H、512C、64S,分区格式化后,分区的开始位置为0H、1CH、1S,分区引导程序所在的LBA是0000064H,另一台机子的BIOS认成16H、1024C、32S,那么我们刚才做的那个启动盘,分区起始扇区的LBA就变成0000032H,很显然位置错了,当然启动不起来了。
BIOS对每道扇区数、每头柱面数的不同设置就是导致U盘启动不通用的根本原因。
也许你会说那么我们引导程序干脆直接使用扩展INT 13H发送LBA包,GRUB就是这种思路,可是有的BIOS并不支持U盘的扩展INT 13H功能,并且在检测的时候还会返回支持的假象-_-!!
其实386时代的硬盘也遇到这个问题,然而当时CMOS里面提供了硬盘类型参数的手动设置,再加上硬盘不是移动存储设备,所以问题就没那么明显了。
至于HDD、FDD、ZIP只是媒体介质描述的不同,并不能彻底解决CHS问题。
[ 本帖最后由 netwinxp 于 2008-7-2 11:26 PM 编辑 ] |
|