插入 轉動 可能 線程 什麽 linux驅動 linu linux設備驅動 一個

關於linux設備驅動是否使用全局變量的問題

今天有人問我,關於linux設備驅動是否使用全局變量的問題,為什麽說盡量不使用全局變量?

其實這個問題從兩方面說:
1)使用全局變量,那麽破壞了函數的重入性,為了實現函數重入,又不得不使用鎖來保護全局變量。這個效率變得低下了。
函數重入,主要是使用局部變量,即變量放在線程的棧中,各自使用自己的,就不會沖突。另外一種是使用鎖來保護,保證數據的完整性。

2)使用全局變量,那麽就違背了linux驅動的編寫原則。即一個驅動程序應該支持驅動多個設備同時工作。例如馬達,一個馬達驅動程序可能同時操作多個馬達,多個軸的方向轉動,一個馬達控制一個軸向,例如x軸,y軸,z軸。 如果驅動程序裏使用全局變量來保存設備信息,那麽沒法做到同時支持保存多個設備信息了。如果使用鏈表方式,一個鏈表節點保存一個設備信息,雖然可行,但是每次內核操作你的驅動的api時傳入的struct device(例如struct i2c_client,內含了struct device),你不得不遍歷鏈表並比較對象指針才能找到操作的設備的信息。顯然效率低。

所以其實正確的方法是:
在probe時,分配一個私有結構體作為保存此設備的狀態信息。然後調用dev_set_drvdata系列函數,把你分配的結構體和probe時傳入的struct device進行綁定。 struct device是總線驅動在探查到新設備插入時創建的。
後面系統調用你的驅動的api函數時,傳入的struct device,你通過dev_get_drvdata系列函數取回你的為此設備分配的私有結構體(內含具體設備的狀態信息,例如i2c地址等),從而知道是操作哪個具體設備。

具體請參考我的《linux設備驅動模型》視頻,
https://edu.51cto.com/course/17159.html
還有我的《如何編寫設備驅動》或《深入linux內核》視頻
https://edu.51cto.com/course/17132.html
https://edu.51cto.com/course/17155.html

另外我的相關培訓視頻請看:
歡迎觀看我發布的各個課程: https://edu.51cto.com/lecturer/8896847.html

關於linux設備驅動是否使用全局變量的問題