前言pm8001驅動是linux標準核心自帶的hba驅動,由於完全開源,所以對於學習linux儲存系統底層很有幫助。筆者有幸在之前的工作中使用過這款hba,所以結合實際使用和原始碼稍微記錄一下。由於已經過去很久了,現在重新拿起來看,有些地方理解的會有疏忽,敬請諒解和多提寶貴意見。
對於pm8001
這個裝置,其與主機通過pci
匯流排連線,屬於scsi
子系統中的底層模組。scsi
子系統按功能和邏輯結構可以劃分成三層。系統結構如圖所示。
本文的主線是根據pm8001
驅動(較低層)來展開,其間會涉及到中間層相關部分的分析,但對於頂層涉及得不多。
scsi
子系統中間層和較低層簡要分析
scsi
中間層功能簡介
在進行對pm8001
驅動分析之前,先簡要根據我的理解分析一下scsi
子系統中的中間層和較低層。
中間層顧名思義是介於scsi
子系統頂層和較低層之間的層次。中間層是scsi
子系統分層模型核心意義的體現——它能夠解除頂層和較低層之間的耦合,並為頂層和較低層提供一系列服務。中間層能夠解除頂層與較低層的耦合關鍵在於中間層提供了lld
的抽象介面scsi_host
和能夠復刻scsi_host
物件的scsi_host_template
。當較低層將scsi_host
註冊到中間層後,中間層即可以呼叫lld
相關函式。同理,頂層的驅動也可以通過中間層間接地使用lld
的函式。所以在lldd(pm8001
驅動)初始化時,先例項化乙個scsi_host_template
物件,將本身的一些函式實現掛載到這個物件中,然後在後續的pci
裝置的probe
函式中將這個物件以及對應的scsi_host
註冊到中間層。
中間層出了解耦合功能以外,也起到了轉換器的作用,即中間層會把從頂層傳入的請求操作轉換成scsi
命令。在我們的體系中,中間層將請求轉換成scsi
命令後發向lldd
,lldd
會將命令通過ibq
發往pm8001
,pm8001
將scsi
命令轉換成sas
命令發向指定位址的phy
。另外中間層也提供一系列很重要的函式,比如scsi
匯流排掃瞄演算法,錯誤處理等。
與libsas
的關係根據我的理解,libsas
和pm8001
(可能還會有其他輔助函式庫)共同構成了給予pm8001
板卡的scsi
子系統中較低層的實現。libsas
和pm8001
分別承擔不同的責任,pm8001
部分則包含了大量的邏輯性**,負責對資料(上行/
下行)進行封裝處理或對事件進行響應。
pm8001
提供了一系列與物理裝置相關的函式(sas_domain_function_template
結構體中,以lldd
開頭),在初始化時會被註冊到libsas
中,libsas
中的部分邏輯最終通過呼叫這些函式來實現實際底層的操作。
當pm8001
驅動註冊到scsi
子系統時,註冊過程在pm8001
中完成,但註冊的函式在libsas
中實現。pm8001
中的中斷響應函式,在進行底層初步處理(與pm8001
硬體特性有關,具體參見pm8001
程式設計手冊)後,會把事件遞交給libsas
層對應函式進行進一步處理。
pm8001
初始化過程分析
pm8001
的初始化入口在pm8001_init.c
中。初始化scsi_transport_template
結構。scsi_transport_template
結構體內包含了一系列scsi
命令傳輸所需要用到的引數以及相關函式,這些函式由libsas
層提供。在初始化scsi_transport_template
的過程中,會有乙個sas_internal
中間結構,這個結構中包含有一系列libsas
層在執行中所需要用到的函式模板、引數等資訊,其內部有乙個字段對應scsi_transport_template
結構,可以通過兩者之一獲取對方從而呼叫其包含的函式。
初始化pm8001
的pci
相關部分。
在初始化pci
相關部分的時候,我們可以注意到其中的probe
函式會在主機查詢到了pci
裝置(這裡指pm8001
)時進行呼叫,其主要功能在於對pm8001
裝置進行真正意義上的初始化。
pci相關配置操作。
建立乙個scsi_host
例項。前面有提到過scsi_host
是lldd
被中間層呼叫的介面,它是pm8001
驅動鏈入到整個scsi
子系統的關鍵結構體之一。在這裡通過呼叫scsi_host_alloc
函式對其進行初始化,這個函式中會對其進行引數配置,但主要的例項化過程是通過將scsi_host
中的一些欄位用scsi_host_template
結構中的字段賦值。此外,在初始化的過程中也會在虛擬檔案系統中做相應的註冊。
初始化pm8001_chip_info
。pm8001_chip_info
結構代表著scsi_host_chip
,在這個結構體中有乙個pm8001_dispatch
結構,其中包含了一系列底層邏輯過程。這些底層邏輯過程大多數都跟裝置行為有關,詳細資訊可以參考程式設計手冊。這些底層邏輯過程實際上是根據約定對事件或資料進行分發,而真正意義上的對硬體的操作是集中在pm8001_hwi.c
中一系列以mpi
為開頭的函式;對邏輯的處理最終通過**給libsas
層相關函式進行處理。
初始化sas_ha_struct
。sas_ha_struct
結構體是lld
在libsas
層的抽象,libsas
層可以通過該結構體完成邏輯。
初始化pm8001_hba_info
結構。pm8001_hba_info
結構體是對pm8001
的抽象,這個結構體在後續邏輯中會被經常使用。其中包含了一系列已經繫結的處理函式和相關引數,是程式執行的核心。
軟復位軟復位的一系列操作可以參見pm8001
程式設計手冊,值得一提的是這裡有普通和had
兩種模式,區別在於載入spc 8x6g
韌體映象的方式不同。
初始化chip
chip
的初始化主要是針對一些硬體裝置級的配置資訊,這些主要是通過配置mpi
配置表來完成,mpi
配置表具體資訊參見程式設計手冊第五章。在pm8001
的驅動中並不會(也不需要)對所有引數進行配置。
中斷註冊
初始化sas
位址註冊hba
裝置。這個操作是由libsas
層的函式提供的處理方法完成處理,最終會啟動一條工作處理執行緒。
執行掃瞄scsi
匯流排。這個操作由scsi
子系統中間層提供,用於掃瞄scsi
匯流排,獲取節點。在掃瞄到節點會執行新增lun
操作。執行scsi
掃瞄操作的前後都可以註冊start/finish
函式,這些函式是在pm8001
中實現,包含了一些底層的初始化過程。
PM真的不是PM
去年我和一位美國主任評估師,共同參與了一家國內軟體企業的cmmi評估。訪談時,pm陳述的工作內容,更像是一名開發工程師兼做任務管理的綜合體。而it總監的闡述,則更像是一位真正的pm。事後,我跟這位外國友人聊了一下,他說,從他目前的經驗與獲知的資訊來看,中國的pm基本上都不是pm。這話聽著讓人心裡不是...
PM入門方法
方法1 ask why?從現在開始養成看到每一件事情詢問為什麼的習慣 雖然會很累,但是長期堅持絕對對嚴謹思維和發散思維有幫助 方法2 紙上談來終覺淺,冰凍三尺非一日之寒!對每乙個思考的過程積累的結果,調研並量化後當有收穫了把它記錄下來。方法3 站在巨人的肩膀!接受別人的想法 尤其是出色的創意 相信有...
PM基礎概念
專案是為了創造獨特的產品 服務或成果而進行的臨時性工作。特徵 獨特的產品 服務或成果 開展專案是為了通過可交付成果達成目標。臨時性工作 專案臨時性,是指專案有明確的起點和終點。臨時性,並不一定意味著專案持續時間短。專案驅動變更 專案驅動組織進行變更。專案創造商業價值 指特定專案的成果能夠為相關方帶來...