在此前的NVMe相關(guān)文章中,我們介紹了NVMe SSD格式化的基本原理和操作。本文將進(jìn)一步探討NVMe系統(tǒng)中的另一個(gè)關(guān)鍵組件——Doorbell寄存器。
為了更好地理解Doorbell寄存器,我們先來(lái)介紹一些NVMe隊(duì)列的基本操作。在NVMe協(xié)議中,隊(duì)列是主機(jī)與控制器進(jìn)行信息交換的橋梁。主機(jī)通過(guò)隊(duì)列向控制器發(fā)送請(qǐng)求命令,控制器則通過(guò)隊(duì)列向主機(jī)反饋?lái)憫?yīng)。
主機(jī)和控制器之間通過(guò)隊(duì)列來(lái)完成信息交互,如下圖所示:
1)主機(jī)寫命令到SQ;
2)主機(jī)寫SQ的Tail Doorbell寄存器,通知控制器取指;
3)控制器收到通知后,到SQ中取指;
4)控制器執(zhí)行指令;
5)指令執(zhí)行完成,控制器往CQ中寫指令執(zhí)行結(jié)果;
6)控制器發(fā)中斷通知主機(jī)指令完成;
7)主機(jī)收到中斷,到CQ中取執(zhí)行結(jié)果,查看指令完成狀態(tài);
8)主機(jī)處理完指令執(zhí)行結(jié)果,通過(guò)寫CQ的Head Doorbell寄存器通知控制器指令執(zhí)行結(jié)果已處理。
在此過(guò)程中,Doorbell寄存器起到了關(guān)鍵作用,負(fù)責(zé)實(shí)現(xiàn)主機(jī)與控制器的異步通知機(jī)制,從而顯著提升了主機(jī)與SSD之間的通信效率。
1、Doorbell寄存器關(guān)鍵作用
Doorbell寄存器是SSD控制器內(nèi)的專用寄存器,每個(gè)隊(duì)列對(duì)應(yīng)兩個(gè)Doorbell寄存器,分別用于記錄隊(duì)列的頭(Head)、尾(Tail)位置。以下以提交隊(duì)列(SQ)為例,說(shuō)明如果沒(méi)有Doorbell寄存器,隊(duì)列使用可能出現(xiàn)的問(wèn)題。
主機(jī)作為寫入方,負(fù)責(zé)維護(hù)Tail指針。每次發(fā)送命令時(shí),主機(jī)將命令寫入Tail指針?biāo)傅奈恢谩?/span>主機(jī)和控制器之間沒(méi)有其他通信途徑,主機(jī)只負(fù)責(zé)寫入,控制器無(wú)法得知何時(shí)有新命令到達(dá),因此無(wú)法準(zhǔn)確讀取命令。
控制器作為讀取方,負(fù)責(zé)維護(hù)Head指針。每次讀取命令時(shí),控制器從Head指針?biāo)傅奈恢毛@取命令。然而,由于無(wú)法預(yù)知新命令何時(shí)到達(dá),控制器可能會(huì)進(jìn)行無(wú)效讀取。此外,控制器也無(wú)法將Head指針的位置通知主機(jī),因此主機(jī)無(wú)法得知控制器已讀取到哪個(gè)命令位置。
這種情況下,主機(jī)持續(xù)向隊(duì)列寫入命令,但由于它不知道控制器讀取了多少命令,可能導(dǎo)致新命令覆蓋尚未讀取的舊命令,從而造成數(shù)據(jù)丟失或命令執(zhí)行錯(cuò)誤。
為了解決上述問(wèn)題,NVMe協(xié)議引入了Doorbell寄存器,用于同步主機(jī)和控制器對(duì)隊(duì)列的讀寫操作,以確保數(shù)據(jù)一致性和正確性。
主機(jī)對(duì)Doorbell寄存器僅進(jìn)行寫操作:
- 當(dāng)主機(jī)向提交隊(duì)列(SQ)寫入命令后,會(huì)更新SQ的Tail Doorbell寄存器,以指示新命令的末尾位置。
-
當(dāng)主機(jī)處理完成隊(duì)列(CQ)中的響應(yīng)消息后,會(huì)更新CQ的Head Doorbell寄存器,以指示下一次獲取響應(yīng)消息的起始位置。
對(duì)于控制器寫入的Doorbell寄存器(SQ的Head寄存器和CQ的Tail寄存器),主機(jī)不會(huì)直接讀取這些寄存器,相應(yīng)的隊(duì)列指針位置(SQ的Head和CQ的Tail),由主機(jī)從響應(yīng)消息中直接或間接獲取。這是為什么呢?
由于寄存器在SSD控制器內(nèi)部,主機(jī)訪問(wèn)寄存器需要通過(guò)額外的PCIe命令進(jìn)行傳輸。而在控制器提交CQE(完成隊(duì)列條目)時(shí),SQ的head和CQ的Tail必然是最新值。因此,通過(guò)在CQE攜帶SQ的head和CQ的Tail信息,主機(jī)即可從中獲取相關(guān)指針位置,避免額外的消息交互和信息同步需求。
為了簡(jiǎn)化協(xié)議設(shè)計(jì)并提升處理性能,主機(jī)對(duì)控制器的寄存器采取“只寫不讀”策略。
控制器對(duì)Doorbell寄存器進(jìn)行讀寫操作:
-
控制器通過(guò)讀取SQ的Tail Doorbell寄存器,確定可以讀取的新命令;
-
控制器從SQ獲取命令后,會(huì)更新SQ的Head Doorbell寄存器,以指示下一次讀取的起始位置;
- 控制器處理完命令并將響應(yīng)消息寫入CQ后,會(huì)更新CQ的Tail Doorbell寄存器,以指示新響應(yīng)的末尾位置。
3、Doorbell寄存器的處理流程下表列出了主機(jī)和控制器同步SQ和CQ頭尾指針信息的方式,從而實(shí)現(xiàn)隊(duì)列的讀寫同步。
主機(jī)如何通過(guò)CQE的P標(biāo)識(shí)位確定CQ當(dāng)前Tail位置?
CQE中的P(Phase)標(biāo)識(shí)是一個(gè)位(bit)字段,用于指示該CQE是否是新一輪的隊(duì)列循環(huán),以幫助主機(jī)區(qū)分CQE是屬于前一輪的完成通知還是當(dāng)前輪的完成通知。
在CQ創(chuàng)建時(shí),P標(biāo)識(shí)初始化為0。當(dāng)寫入CQ的第一個(gè)entry,無(wú)論是首次寫入還是隊(duì)列循環(huán)后的寫入,P標(biāo)識(shí)都會(huì)翻轉(zhuǎn)(初始為0,寫第一個(gè)entry時(shí)翻轉(zhuǎn)為1;初始為1,則翻轉(zhuǎn)為0)。
主機(jī)在收到中斷時(shí),初始的期望P值就是Head指針?biāo)傅膃ntry中的P值。在準(zhǔn)備讀取CQ的第一個(gè)entry位置時(shí),期望值隨之翻轉(zhuǎn)。由于控制器支持中斷聚合功能,當(dāng)主機(jī)收到CQ中有entry可以讀取的中斷時(shí),控制器可能已經(jīng)提交多個(gè)CQE到CQ中。
主機(jī)從其維護(hù)的CQ head指針處依次讀取CQ中的entry。如果讀取到的entry中P標(biāo)識(shí)位符合預(yù)期,則處理該entry并移動(dòng)head指針;如果讀P標(biāo)識(shí)位不符合預(yù)期,則表示已經(jīng)讀取到了隊(duì)列Tail位置,隊(duì)列中內(nèi)容已空。
上圖中,“中斷發(fā)生時(shí)”主機(jī)收到中斷,讀取Head指針?biāo)竐ntry,并將當(dāng)前期望P值設(shè)為1。從head指針位置(slot 0)開始處理CQE,依次向后讀取CQE。由于CQE P值均為1,符合預(yù)期,主機(jī)逐一處理CQE并移動(dòng)Head指針。
當(dāng)處理完slot 3,主機(jī)準(zhǔn)備處理slot 4時(shí),讀取slot 4的P值為0,不符合預(yù)期,說(shuō)明已經(jīng)到達(dá)隊(duì)列Tail位置,本輪處理結(jié)束。處理完成后,指針位置如圖中“主機(jī)處理完成后”所示。
上圖中,“中斷發(fā)生時(shí)”主機(jī)收到中斷,讀取Head指針?biāo)竐ntry,并將當(dāng)前期望P值設(shè)為1。主機(jī)從head所在位置(slot 4)開始處理CQE,處理到slot 5,再循環(huán)到slot 0。主機(jī)隨后調(diào)整期望P值為0,繼續(xù)處理slot 0和slot 1。當(dāng)讀取到slot 2時(shí),發(fā)現(xiàn)P位不符合預(yù)期,說(shuō)明已經(jīng)到達(dá)Tail,主機(jī)結(jié)束本輪處理操作。處理完成后,指針狀態(tài)如圖中“主機(jī)處理完成后”所示。
當(dāng)然,主機(jī)也可以在到達(dá)Tail之前的任何時(shí)刻停止本輪處理,此處不再贅述。
從上面例子可以看出,主機(jī)無(wú)法通過(guò)CQE的P標(biāo)識(shí)位直接判斷Tail位置。在未到達(dá)Tail位之前,主機(jī)不能確定Tail具體位置。然而,當(dāng)主機(jī)處理完CQ中所有entry并遇到Tail時(shí),可以及時(shí)停止,從而實(shí)現(xiàn)了隊(duì)列操作的同步和互斥。
以上是Doorbell寄存器在NVMe隊(duì)列操作中關(guān)鍵作用和基本原理介紹。Doorbell寄存器不僅簡(jiǎn)化了主機(jī)與SSD控制器之間的通信流程,還通過(guò)高效的異步通知機(jī)制顯著提升了數(shù)據(jù)處理的速度和效率。
云海芯科將繼續(xù)緊跟SSD技術(shù)的發(fā)展趨勢(shì)和應(yīng)用,立足技術(shù)前沿,持續(xù)推動(dòng)產(chǎn)品創(chuàng)新,提供高可靠的存儲(chǔ)解決方案,助力存儲(chǔ)技術(shù)的進(jìn)步和推廣應(yīng)用。
關(guān)于云海芯科
四川云海芯科微電子科技有限公司是一家業(yè)界領(lǐng)先的數(shù)據(jù)存儲(chǔ)解決方案提供商,團(tuán)隊(duì)核心成員深耕存儲(chǔ)行業(yè)15+年,擁有成熟的存儲(chǔ)產(chǎn)品研發(fā)上市經(jīng)驗(yàn)。公司扎根國(guó)產(chǎn)存儲(chǔ),堅(jiān)持產(chǎn)品和技術(shù)創(chuàng)新發(fā)展,擁有閃存管理、數(shù)據(jù)保護(hù)、硬件設(shè)計(jì)等多項(xiàng)SSD關(guān)鍵技術(shù)專利,具備存儲(chǔ)產(chǎn)品設(shè)計(jì)到開發(fā)的全流程交付能力,已推出NVMe和SATA全系列SSD產(chǎn)品,在HPC/HPDA、云計(jì)算、數(shù)據(jù)中心、虛擬化、人工智能等領(lǐng)域廣泛應(yīng)用,為金融、交通、通信、智能制造、互聯(lián)網(wǎng)、能源等行業(yè)提供高穩(wěn)定、高可靠的存儲(chǔ)解決方案。
相關(guān)推薦