標籤

2009年2月25日 星期三

UFI

http://bbs.wuyou.net/viewthread.php?tid=127538&page=1#pid1430790

細節部分請上網下載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問題。

沒有留言: