轉(zhuǎn)---PCIe和NVMe SSD初始化過程簡介

PCIe和NVMe SSD初始化過程簡介?

1.PCIe初始化流程

PCIe硬件初始化完成的標志是盤進入最大速率L0狀態(tài)芥喇,進入L0狀態(tài)后,主機和盤就能正常使用TLP報文進行數(shù)據(jù)傳輸启盛。參見圖1姊氓。


從狀態(tài)機可以看到凡桥,盤進入L0只能是通過Configuration或者Recovery進入(L0s只能通過L0狀態(tài)進入蟀伸,再退出到L0)。

下圖是抓取的一次盤的完整上電LTSSM跳轉(zhuǎn)缅刽,左邊是盤啊掏,右邊是槽位。參見圖2衰猛。


從整體的LTSSM可以看到迟蜜,盤是從Detect -->?polling-->configuration-->G1 L0?-->Recovery?-->G3?-->G4 L0;

接下來我們再來解釋一下初始化過程中的每一個狀態(tài)啡省。

1)Detect

Detect狀態(tài)是設(shè)備上電復位或者熱復位后的第一個狀態(tài)娜睛,也就是LTSSM的入口狀態(tài),當前設(shè)備檢測到對端設(shè)備在位后卦睹,就會往下進入polling狀態(tài)畦戒。檢測方法是發(fā)送端改變鏈路電壓對鏈路充電,根據(jù)充電時間長短來判斷對端是否在位结序。

2)Polling

進入此狀態(tài)障斋,說明兩者已經(jīng)相遇了,接下來就需要打個招呼,看下是否能夠正常交流垃环。

在這個狀態(tài)下邀层,兩端設(shè)備通過互相發(fā)送TS1和TS2來確認Bit Lock, Symbol Lock,Polarity Inversion等遂庄,參見圖3寥院。


從Trace中可以看到這個過程中發(fā)送的內(nèi)容都是F7,也就是PAD涛目,無實際意義只磷,只是通過發(fā)送一定數(shù)量的序列看是否滿足協(xié)議要求。參見圖4泌绣。


3)Configuration

進入此狀態(tài),說明兩者使用的是同一種語言预厌,交流無障礙阿迈,為了能達成合作需要進行更深入的交流。

該階段兩邊通過TS1和TS2來確認Link number和Lane number轧叽。參見圖5苗沧。


從Trace中可以看到TS1,TS2里面的Training Lanes和Training Links都是確切的值,通過這些值來進行信息交換炭晒。參見圖6待逞。


4)L0

進入此狀態(tài)后,意味著雙方交流完成了网严,可以開始愉快合作了识樱。也就是可以進行DLLP和TLP通信了。TLP packet承載真正的命令(例如MRd震束,CfgRd等)和響應(yīng)怜庸,每一個TLP發(fā)出后嗽测,接收端要回復一個DLLP ACK表示收到了TLP狂鞋,如果接收端收到的TLP有bit error或者CRC error,那么就會回復NAK栅干,參見圖7一個CfgRd的一個transaction嘉栓。


第一次進入的時候是GEN1的狀態(tài)宏榕,但期望的是最大協(xié)商能力的L0狀態(tài),因此就需要再次重新交流一下侵佃,達到最佳合作狀態(tài)麻昼,也就是跳入Recovery狀態(tài)。

5)Recovery

進入此狀態(tài)趣钱,說明雙方認為還能繼續(xù)交流一下涌献,爭取達到合作共贏的最佳狀態(tài)。

這是一個重新訓練狀態(tài)首有,目的是達到最佳鏈路狀態(tài)燕垃,進入該狀態(tài)比如鏈路異常枢劝,未達到最大速率或者最大寬度。參見圖8卜壕。


從Trace中可以看到您旁,兩端設(shè)備執(zhí)行重協(xié)商動作都是通過TS序列中的一些特殊字段,比如Speed Change Bit轴捎,EqCmd Bit來指示實現(xiàn)的鹤盒。參見圖9和圖10。



經(jīng)過Recovery后侦副,盤和主機以GEN4X4的期望狀態(tài)進入L0侦锯,達到了最佳合作狀態(tài)。

以上就是一次正常上電協(xié)商的狀態(tài)機跳轉(zhuǎn)秦驯,至于狀態(tài)機中的其他狀態(tài)可以參考協(xié)議尺碰。

至此PCIe硬件初始化已經(jīng)全部完成,接下來就是主機軟件對設(shè)備的處理译隘,主要是設(shè)備的枚舉以及資源分配亲桥,設(shè)備設(shè)置等。

從Trace中看到主機下發(fā)的第一個TLP報文固耘,配置讀取設(shè)備的Device ID题篷,這表明主機軟件已經(jīng)開始接管PCIe設(shè)備了。參見圖11厅目。

圖11

關(guān)于主機軟件對PCIe的初始化番枚,我們暫且跳過,這是對所有PCIe設(shè)備的通用流程璧瞬,接下來我們直接看一下NVMe層的初始化户辫。

2.NVMe初始化流程

主機軟件初始化完P(guān)CIe后,開始加載NVMe驅(qū)動嗤锉,也就是初始化NVMe渔欢。(因為抓取的是上電Trace,而這個主板BIOS支持NVMe設(shè)備瘟忱,因此下面的Trace是BIOS下NVMe初始化流程奥额,和OS下的NVMe驅(qū)動稍微有點差異,但整體原理和流程是一樣的)访诱。

首先看一下NVMe Controller的寄存器定義垫挨,有助于對照Trace解析。這些寄存器的基地址是設(shè)備的BAR0地址触菜。參見圖12九榔。

圖12

1)獲取NVMe設(shè)備的基本信息

參見圖13,可以看到BAR0基地址是0Xfc80000,讀取了偏移0,8哲泊,14剩蟀,1c寄存器,從寄存器狀態(tài)可以看到這是一個支持NVMe 1.3協(xié)議的控制器切威,并且NVMe層 Not Ready育特。

圖13

2)配置NVMe設(shè)備的Admin Queue

圖14-1

參見圖14-2,這是一個典型的NVMe storage的架構(gòu)圖先朦,從圖中可以看出需要有admin submission queue以及completion queue, 然后創(chuàng)建IO submission queue 和completion queue缰冤。

圖14-2

3)做NVMe Controller Reset,等待Reset完成

參見圖15喳魏,寫偏移14寄存器的Bit0,做NVMe Controller Reset棉浸,然后輪詢1C寄存器的Bit0,等待status為1刺彩,為1表明盤側(cè)NVMe reset完成涮拗,NVMe Controller Ready。

這一步完成后迂苛,主機和盤之間可以通過Admin Queue進行管理消息通信。

圖15

4)初始化NVMe字符設(shè)備

參見圖16-1&2鼓择,盤硬件NVMe初始化完成后三幻,盤能執(zhí)行Admin命令,主機給盤發(fā)送一些管理命令從而獲取到盤的信息呐能,包括set-feature和identify這些命令念搬。主機通過盤返回的信息,創(chuàng)建字符設(shè)備摆出,完成NVMe字符設(shè)備初始化朗徊。下面是一個Admin命令(set-feature)的Trace,從這個Trace中我們可以看到一個完整命令的執(zhí)行過程偎漫,這些地址都能和前面Trace看到的設(shè)置地址一致爷恳。其他命令,包括IO命令也是類似的象踊。

圖16-1

圖16-2

5)初始化NVMe塊設(shè)備

參見圖17~19温亲,主機對盤數(shù)據(jù)的讀寫IO操作是通過塊設(shè)備來完成的,盤的每個NS在主機上就是一個塊設(shè)備杯矩,并且IO是通過IO Queue來通信栈虚,和Admin Queue分離。

首先主機會創(chuàng)建IO CQ和IO SQ(queue的個數(shù)以及SQ/CQ綁定關(guān)系由主機軟件決定)史隆,然后發(fā)送identify ns枚舉所有的ns魂务,并且為每個ns創(chuàng)建一個塊設(shè)備,完成主機塊設(shè)備初始化。

圖17-1為一個創(chuàng)建IO submission queue 的解碼粘姜。

圖17-1

圖17-2為初始化過程中創(chuàng)建了多個IO submission queue和completion queue, 然后才開始進行read讀操作鬓照。

圖17-2

完成后主機就可以對盤上數(shù)據(jù)進行讀寫操作了,到此整個NVMe SSD初始化完成相艇。

以下是一個Read Cmd颖杏,其中圖18為transaction圖,圖19-1為NVMe command處理的過程坛芽,圖19-2為該Read Cmd的transaction 過程解碼留储。

PCIe和NVMe SSD初始化過程簡介_狀態(tài)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咙轩,隨后出現(xiàn)的幾起案子获讳,更是在濱河造成了極大的恐慌,老刑警劉巖活喊,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐膝,死亡現(xiàn)場離奇詭異,居然都是意外死亡钾菊,警方通過查閱死者的電腦和手機帅矗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煞烫,“玉大人浑此,你說我怎么就攤上這事≈拖辏” “怎么了凛俱?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長料饥。 經(jīng)常有香客問我蒲犬,道長,這世上最難降的妖魔是什么岸啡? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任原叮,我火速辦了婚禮,結(jié)果婚禮上巡蘸,老公的妹妹穿的比我還像新娘篇裁。我一直安慰自己,他們只是感情好赡若,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布达布。 她就那樣靜靜地躺著,像睡著了一般逾冬。 火紅的嫁衣襯著肌膚如雪黍聂。 梳的紋絲不亂的頭發(fā)上躺苦,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音产还,去河邊找鬼匹厘。 笑死,一個胖子當著我的面吹牛脐区,可吹牛的內(nèi)容都是我干的愈诚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牛隅,長吁一口氣:“原來是場噩夢啊……” “哼炕柔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媒佣,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匕累,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后默伍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢嘿,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年也糊,在試婚紗的時候發(fā)現(xiàn)自己被綠了炼蹦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸剃,死狀恐怖框弛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捕捂,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布斗搞,位于F島的核電站指攒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏僻焚。R本人自食惡果不足惜允悦,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虑啤。 院中可真熱鬧隙弛,春花似錦、人聲如沸狞山。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萍启。三九已至总珠,卻和暖如春屏鳍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背局服。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工钓瞭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淫奔。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓山涡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唆迁。 傳聞我的和親對象是個殘疾皇子鸭丛,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容