儲存 NVMe 7 控制器架構

2021-10-19 12:50:40 字數 4481 閱讀 3745

原文出處。

控制器是host和nvm子系統之間的介面。有三種控制器:

identify controller中的controller type指定控制器型別。所有控制器均實現乙個adminsq和admincq,不同控制器可能支援實現多個io提交佇列和完成佇列。

host軟體向提交佇列中提交命令給控制器,通過寫sq tail db,控制器被通知新提交命令。之前db暫存器值和當前db暫存器的值的差值表示提交了多少命令。

控制器從提交佇列中取回命令,並執行命令。除了fused op,從多個提交佇列中取出的命令在執行上是可以亂序的。命令下發的順序與資料在非易失介質上存放的順序,因為亂序執行的存在,並沒有必然的聯絡。

主機軟體將更高優先順序的命令提交到適當的提交佇列。優先順序與提交佇列本身相關聯,因此命令的優先順序基於該命令被提交到的提交佇列。控制器通過公平和優先順序策略仲裁提交佇列。

一旦命令被nvm子系統執行完畢,控制器將完成佇列項cqe通過完成佇列提交至host。若msi-x或者多個msi被使用,那麼中斷向量指示完成佇列有新的命令完成需要host處理。host更新cq head db暫存器釋放提交佇列項cqes,並清除相應中斷。

i/o控制器是一種通用控制器,它支援對nvm子系統的非易失性儲存介質提供訪問的命令,並可能支援提供管理功能的命令。

io控制器、命令空間關係:

命令下發和完成機制,host構建命令,和命令完成。

命令提交和完成步驟:

host將要處理的多個cmd放在下乙個提交佇列槽位(next sq slots);

host用新的提交佇列尾指標更新提交佇列尾部db暫存器,告知控制器新cmd被提交,需要處理;

控制器將cmd從提交佇列槽位傳輸至控制器,仲裁機制用於決定控制器執行哪乙個提交佇列下發的cmd;

控制器處理下乙個cmd的執行,cmd可能亂序執行;

在cmd執行完成後,控制器在關聯的完成佇列中放cqe,在cqe中,控制器記錄提交佇列頭指標位置sqhd(cqe:cdw2(15:00)),每個新cqe會反轉phase tag表示這個cqe是新的;

控制器向host產生中斷,告知host有新cqe要被處理。

host處理cqe,包括對錯誤產生動作;

host寫cqhd(完成佇列頭db暫存器)告知cqe被消耗。host在消耗cqe後更新關聯的cqhd.

host軟體在sqx[pfreeslot]構建cmd:

cdw0.opc設定為合適的cmd;

cdw0.fuse 是否為fused op;

cdw0.cid 與sq組合形成唯一的cmd id;

nsid

mptr, 記錄meta region偏移。

prp1/2記錄資料傳輸的src/dst

cdw10-15 cmd spec info

host軟體寫相應提交佇列db暫存器(sqxtdbl),提交多個cmd處理。

對提交佇列db暫存器寫操作會觸發控制器從提交佇列中取sqe,控制器將在完成項cqe中反饋最近處理的sqe。

host軟體處理控制器因為命令完成產生的中斷。

host軟體從完成佇列中讀取cqe;

host軟體處理cqe,dw2.sqid指示提交佇列id,dw3.cid指示完成cmd;

dw3.sf指示cmd完成狀態;

host軟體通過更新相應的完成佇列head db暫存器(cqyhdbl)指示可用的完成佇列槽位。更新cqyhdbl,相應的中斷也會被清除;

如果有錯誤,dw3.sf中會記錄錯誤,host軟體會執行錯誤恢復動作。

建立io提交佇列和完成佇列:

初始化adminqueue屬性(aqa),adminqueue基位址(asq),完成佇列基位址暫存器;

配置io提交佇列和完成佇列大小cc.iosqescc.iocqes;

對io sq/cq下發set feature設定佇列屬性,set feature的cqe指示io提交佇列和完成佇列的個數;

設定每個佇列支援的最大qe個數(cap.mqets)和是否需要佇列在物理上連續(cap.cqr);

建立io完成佇列;

建立io提交佇列

spec允許控制器配置4種模式的中斷:1)pin-base interrupt, 2) single message msi, 3) multiple message msi, 4) msi-x。 其中推薦使用msi-x,高效能、低延時、處理中斷時低cpu利用率。

中斷聚合,也被稱為中斷合併,通過降低控制器生成中斷請求的速率來減輕主機中斷開銷。

7.5.1.1.1 interrupt example (informative)

軟體處理中斷流程:

處理器將cqe放入io完成佇列,控制設定is暫存器,控制器向主機斷言乙個中斷。

觸發中中斷服務例程;

host軟體掃瞄io完成佇列,判斷cqe的位置;

host軟體寫xxhintms暫存器,對中斷向量做掩碼處理;

處理器對中斷向量做掩碼;

主機軟體安排乙個延遲過程呼叫(dpc)來處理完成的命令;

觸發延遲過程呼叫(dpc);

主機軟體處理i/o完成佇列3的新完成佇列條目,完成與作業系統相關的命令,host軟體更新cqyhdbl應答處理的cqe,並且清除中斷。

host軟體解除掩碼。

host執行命令前的初始化:

根據系統配置設定pci/pci express暫存器,包括電源管理配置;

host等待控制器完成前乙個reset操作,csts.rdy變成0;

配置adminqueue,admin queue attributes(aqa), admin sq base address(asq), admin completion

queue base address (acq);

配置控制器,1) 仲裁機制,cc.ams2) 記憶體頁大小,cc.mps3)設定被使用的io cmd set,或者設定cc.css使得只有admin command set被支援。

控制器使能,cc.en=1;

host等待,直到控制器準備處理cmd,csts.rdy=1

主機應該通過發出identify命令來確定控制器的配置,並指定控制器資料結構。然後,主機應該為每個namespace發出identify命令,指定命名空間資料結構,從而確定每個namespace的配置;

如果控制器實現了i/o佇列,那麼主機應該使用帶有佇列數量特徵識別符號的set features命令來確定i/o提交佇列和i/o完成佇列的數量。在確定i/o佇列的數量後,應該配置msi和/或msi-x暫存器;

如果控制器實現了i/o佇列,那麼主機應該根據系統配置所需的數量和控制器支援的數量分配適當數量的i/o完成佇列。使用create i/o completion queue命令分配i/o完成佇列;

同上,io sq;

要啟用可選事件的非同步通知,主機應該發出set features命令,指定要啟用的事件。要啟用事件的非同步通知,主機應該提交適當數量的非同步事件請求命令。這個步驟可以在控制器發出控制器準備好了的訊號之後的任何時刻執行(csts.rdy=1)。

host執行shutdown操作:

停止向控制器提交任何新的i/o命令,並允許任何未完成的命令完成;

如果控制器實現了i/o佇列,那麼主機應該使用delete i/o submission queue命令刪除所有i/o提交佇列。

成功完成delete i/o submission queue命令的結果是,剩餘的未執行命令將被中止;

如果控制器實現了i/o佇列,那麼主機應該刪除所有i/o完成佇列,使用delete i/o completion queue命令;

主機應該將shutdown notification字段設定為cc.shn=01b,以表示正常關閉操作。控制器通過將shutdown status (csts.shst)字段更新到10b來指示shutdown處理何時完成。

host軟體處理非同步事件請求(aer)

儲存控制器

嵌入式linux學習筆記 三 儲存控制器 一 使用儲存控制器訪問外設的原理 1 s3c2440的位址空間 s3c2440對外引出27根位址線addr0 addr26,訪問範圍只有128mb,cpu對外還引出8根片選訊號ngcs0 ngcs7,對應bank0 bank7,當訪問bankx的位址空間時,...

儲存控制器

在s3c2410 s3c2440中,儲存控制器提供了訪問外設 所需的訊號。其中,位址線addr0 addr26的訪問範圍為128m,此外cpu還對外引出了8根片選訊號,ngsc0 ngsc7,對應於bank0 bank7,如此一來,位址空間達到了1g。每乙個bank其實可以對應一種外設。比如 ban...

儲存控制器

個人看資料的理解,可能有誤,歡迎指正 這一部件是用於擴充套件的外設的,它所產生引導出的rom的8個bank是應用於擴充套件的外設 如網絡卡,sdram等 使得這些擴充套件外設可以通過匯流排形式來訪問擴充套件的外設。對於32位cpu,它可使用的位址範圍達到4gb。其中的1gb就是該部件所引申對應的,另...