bloggerads

2016年8月5日 星期五

ATA : SATA-to-USB and SSD

由於USB的方便攜帶跟普及性,所以現在市售走USB protocol 的外接硬碟非常多,大部分的構造都是一顆SATA硬碟搭配SATA-to-USB  轉卡。還有些人是自行購買SATA-to-USB  轉卡透過USB port來外接硬碟 or SSD。接 SSD這樣的用法是有隱憂的,接下來解釋原因。

以上的架構(SATA過轉卡轉USB), 如果想傳原生的ATA Command給硬碟,則必須穿過  SATA-to-USB  轉卡才能將ATA command傳給碟機。方法是透過呼叫  DeviceIoControl 來發出  SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER以前在硬碟廠寫相關Utility (Update FW/ Identify...), 就是透過這個protocol發出ATA 給硬碟。

能夠在作業系統底下Access碟機,以硬碟廠的角度可以提供FAE做初期的檢測(看Smart table / 下一些Vendor Specific的command來判斷FTL/GC出了什麼樣的問題)當然還有最重要的update FW



然而一般使用者透過SATA-to-USB轉卡外接SSD,這樣卻隱藏著硬碟資料損壞的機會以及PE Cycle增加的隱憂。資料損壞的原因是SSD組成的原件NAND Flash, 現在幾乎都是使用19nm/15nm或更低的製成, 大多又是TLC架構,如果在斷電前OS沒有告知碟機,讓碟機FW介入做一些斷電前的保護(如: 補Dummy data),那麼一些尚未被closedblock下次讀回來ECC就會飆高而進入FW的Error recovery程序,甚至loss data。而PE Cycle增加的原因是因為沒有Trim command, 造成碟機的Garbage collection演算法一直把已經刪除的資料在Nand flash裡搬來搬去。

蒐集市售的SATA-to-USB轉卡發現到,有些外接轉卡並不會忠實的把從OS傳過來的指令轉發給後面的碟機,像是ATA Standby Immediate command這種告訴碟機要準備斷電的指令就不一定會有,另外,OS也不會透過轉卡發Trim Command, 因為Trim Command是屬於ATA規範的Command。 

因此我的作法都會在移除SATA-to-USB轉卡上的硬碟之前,透過IOCTL_SCSI_PASS_THROUGH_DIRECT 下Standby Immediate 這個ATA command給碟機。 另外Trim command這個解法則是將準備刪掉的資料先統一丟到某個待刪資料夾,直行刪除的命令時,碟機記得接到原生的Sata port而不要過轉卡,這樣OS才會發出Trim command告訴碟機哪些是無用的LBA(資料)讓SSD FW實際去刪掉它。


2 則留言: