PM8001驅動及相關模組分析 綜述及初始化

2021-06-26 19:11:43 字數 3758 閱讀 5632

前言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基礎概念

專案是為了創造獨特的產品 服務或成果而進行的臨時性工作。特徵 獨特的產品 服務或成果 開展專案是為了通過可交付成果達成目標。臨時性工作 專案臨時性,是指專案有明確的起點和終點。臨時性,並不一定意味著專案持續時間短。專案驅動變更 專案驅動組織進行變更。專案創造商業價值 指特定專案的成果能夠為相關方帶來...