當前位置:
首頁 > 最新 > Windows NVMe驅動–Microsoft Inbox vendor command制定

Windows NVMe驅動–Microsoft Inbox vendor command制定

作者 江波龍 譚榮

Windows 10下的NVME存儲驅動分為兩種——Microsoft Inbox、OFA Reference Driver。前者為Closed source driver (Microsoft),也就是通常所說的原生態驅動;後者為Open source driver (Reviewing Companies: HGST, Intel, Samsung),方便各大廠商為了提升自己的ssd產品性能,針對性地開發自己的驅動。兩者存在較大差異,最顯著的是Microsoft Inbox driver只能支持到NVMe 1.0e(no support for multi-initiator, NS mgmt, controller list, etc.),而OFA Reference Driver只能支持到NVMe 1.2(multi-initiator, NS mgmt, controller list)。本文就Microsoft Inbox下vendor command制定談下自己的理解。

很久以前有個問題一直困擾過我很久——那就是在OFA Reference Driver下制定的一套vendor command,在Microsoft Inbox下一直是行不通的,由於後者是閉源驅動,而處在底層SSD firmware的我一直不明白嚴謹的上層host究竟要鬧哪樣,為何老是要無情地拒絕我的command request?直到後來我才發現在Microsoft 官網針對這塊專門有一個Working with NVMe drives的說明,其中有兩段話說的很具體:

大概意思就是在StoreNVMe.sys里vendor-specific commands是通過Pass-through mechanism來pipe through的,另外每個制定的vendor commands必須在Command Effects Log描述其屬性,用以告訴host這個命令將對target device會有什麼影響!明白了這點後似乎豁然開朗,但是也沒那麼簡單,千萬記得host是很嚴謹的,細則還是很多。接下來演示一個vendor command的制定流程(歡迎來到王者榮耀!)。

第一步:identify里告訴host設備支持Supported and Effects log page命令(告訴隊友——我拿buffer還是我打輔助!),這樣一來每次上電host就會發送該命令用來讀取device支持哪些私有命令碼。

第二步:命令碼的制定,請注意不要太隨意了(猥瑣發育別浪!),必須嚴格按照標準制定命令碼,以admin命令為例:

首先你只能選擇C0-FFh範圍,其次要搞明白transfer是read or write?是否帶數據?假設是read那麼01:00這兩個bit必須是10b。現假設制定了一個0xCE的讀私有命令碼。

第三步:填充Supported and Effects log page里0xCE命令的屬性(修改銘文!)

這裡因為你的opcode是0xCE,所以要在ACS206的欄位里去填充它對應的結構體:

Csupp:表示device是支持該欄位對應的Opcode的;

Lbcc:表示該私有命令會改變LBA內容;

Ncc:表示該命令會對Ns的capability產生影響;

Nic:表示該命令會對NS的數量產生影響;

CCC:表示該命令會更改ssd controler中Cap register的屬性;

Cse:表示在多命令處理時該命令提交與執行的限定條件;

第四步:按照該結構將你定義好的命令碼填充進去,再通過host調用相關的API下發給device。(victory!)

喜歡就請分享轉發!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ssdfans 的精彩文章:

30厘米長的M.2 SSD,你可以擁有
StarBlaze告訴你Program Suspend有啥用
IOPS/GB是什麼?
全球首款64層3D TLC固態硬碟Intel 545s評測

TAG:ssdfans |