LINUX驅動註冊過程失敗處理不當引起的惡果

2021-06-06 16:41:23 字數 1040 閱讀 4959

linux驅動註冊過程失敗處理不當引起的惡果

linux裝置驅動有標準的結構,註冊的時候對比device和driver的名字,如果相等就呼叫probe函式將資源註冊進去,但是如果註冊失敗,在probe中途退出的時候要注意,如果直接退出,但是原來註冊了部分資源,如果不設定錯誤原因的引數返回,預設是成功返回這樣,錯誤的驅動就會被其他資源使用,但是由於沒有完成註冊好,缺少資源。或者由於註冊失敗在中途退出雖然將原來的資源釋放掉了,但是probe沒有設定錯誤原因,結果被認為註冊成功。這樣別的地方呼叫驅動就會出問題。會空指標引起宕機。

另一方面,如果某個裝置壞了,或者沒有裝上某個裝置,執行probe探測函式的時候,如果**結構不好,開始先執行部分申請了資源**,然後做裝置探測,如果探測不到裝置就退出註冊驅動過程,但是退出的過程沒有釋放前面申請的資源,結果就會引起***,比如待機電流大,待機宕機。

比如,編寫camera驅動,如果流程不對,在probe的時候先申請camera控制器的時鐘,把控制器的時鐘開啟了,但是由於camera有問題,導致後面的初始化出錯,就退出註冊,但是沒有按照註冊的反方向將資源釋放,沒有將控制器時鐘資源釋放,沒有關閉camera的控制器時鐘。由於註冊不成功,沒有將suspend和resume註冊進去驅動鏈表,睡眠的時候不會執行suspend函式,不會關閉camera控制器的時鐘,導致時鐘的投票關閉不通過,19m的時鐘不會關閉,系統能夠睡眠,但是睡眠電流就有接近17ma的電流(正常睡眠電流是2ma)。另外正常工作的電流也比原來大。這種情況可以no_console_suspend新增到命令列,用示波器看看19m時鐘在系統睡眠狀態是否存在。在睡眠模組將時鐘樹列印出來,看那個時鐘開啟。

如果註冊某個裝置,已經將裝置節點註冊到了鍊錶,但是中途出錯,退出的時候又沒有將節點釋放,結果suspend函式指標是空的,睡眠的時候呼叫到這個裝置的suspend函式就會由於空指標引起宕機。

正常的流程是註冊過程失敗的時候,要按照申請資源的反方向將原來申請的資源釋放掉,否則會出現孤兒資源,包括記憶體洩漏,開啟了裝置的電源沒有關閉導致電流過大,開啟了控制器時鐘沒有關閉導致電流過大,孤兒資源導致空指標引起panic等等的問題。雖然這裡就幾行文字,但這是多年的經驗。也是比較難查的問題。

LINUX驅動註冊過程失敗處理不當引起的惡果

linux驅動註冊過程失敗處理不當引起的惡果 linux裝置驅動有標準的結構,註冊的時候對比device和driver的名字,如果相等就呼叫probe函式將資源註冊進去,但是如果註冊失敗,在probe中途退出的時候要注意,如果直接退出,但是原來註冊了部分資源,如果不設定錯誤原因的引數返回,預設是成功...

Linux驅動程式設計(十) 驅動註冊

驅動註冊使用結構體platform driver,該結構體在 include linux platform device.h 中,使用命令開啟 vim include linux platform device.h驅動註冊函式platform driver register,驅動解除安裝函式plat...

linux匯流排,裝置,驅動註冊

遵守udev裝置模型,首先註冊匯流排,然後是匯流排裝置,之後是具體裝置註冊,註冊完之後就可以在sys bus相應的目錄下面找到掛載這個匯流排上的裝置,最後是註冊驅動,驅動會查詢匯流排上的裝置進行繫結。比如 自定義乙個裝置是my vir device,使用匯流排是vir bus。1.註冊匯流排型別 s...