你可以把全局變量視為一個“公共資源”,就像在辦公室里,大家可以隨意調(diào)整中央空調(diào)的溫度。

如果沒有協(xié)調(diào)機(jī)制,A喜歡冷,B喜歡熱,每個人都在隨意改動,最終導(dǎo)致誰都不滿意。
相比之下,如果每個人都有自己的小空調(diào)(類似于私有數(shù)據(jù)),他們就可以獨(dú)立調(diào)節(jié)溫度,互不影響,從而提高工作效率。
將變量封裝到結(jié)構(gòu)體中,就好比給每個設(shè)備配備了獨(dú)立的“小空調(diào)”,使得驅(qū)動程序更加靈活、可靠和可擴(kuò)展。
1
避免并發(fā)訪問問題
全局變量在內(nèi)核中是共享的,多個進(jìn)程或線程可能會同時訪問這些變量。
如果沒有合適的同步機(jī)制(如鎖),這可能導(dǎo)致競態(tài)條件(race condition),引發(fā)不可預(yù)知的錯誤。
通過將變量封裝在結(jié)構(gòu)體中并設(shè)置為私有數(shù)據(jù),每個設(shè)備實(shí)例都有自己獨(dú)立的變量,從而避免多個設(shè)備或進(jìn)程共享同一個全局變量所導(dǎo)致的競態(tài)問題。
這是典型的“數(shù)據(jù)局部化”,使變量和設(shè)備邏輯獨(dú)立,保持?jǐn)?shù)據(jù)隔離。
例如,假設(shè)有兩個設(shè)備A和B,它們共享一個全局變量status。如果設(shè)備A修改了status,而設(shè)備B同時讀取或修改它,就可能導(dǎo)致設(shè)備行為異常或數(shù)據(jù)不一致。將status封裝到結(jié)構(gòu)體中并通過私有數(shù)據(jù)訪問,A和B就各自擁有自己的status,從而避免沖突。
2
支持多設(shè)備實(shí)例
在Linux驅(qū)動程序中,通常需要支持多個設(shè)備實(shí)例。
每個設(shè)備都有自己的狀態(tài)和配置。如果使用全局變量,所有設(shè)備將共享這些變量,這在多設(shè)備環(huán)境下會造成嚴(yán)重問題,因?yàn)闊o法區(qū)分不同設(shè)備的狀態(tài)。
將設(shè)備的狀態(tài)信息存放在結(jié)構(gòu)體里,通過platform_device或file結(jié)構(gòu)中的private_data字段訪問,每個設(shè)備實(shí)例都能有獨(dú)立的數(shù)據(jù)空間。
這種設(shè)計不僅讓驅(qū)動程序能夠支持多個設(shè)備,還能提高代碼的可維護(hù)性和模塊化程度。
例如,在有多個UART(串口)設(shè)備同時存在的情況下,如果它們共享一個全局的baud_rate,任何一個設(shè)備對波特率的修改都會影響到其他設(shè)備。通過私有數(shù)據(jù),每個串口設(shè)備都有自己獨(dú)立的baud_rate,不會相互干擾。
3
提高代碼的可重用性和模塊化
全局變量會破壞代碼的封裝性,導(dǎo)致難以維護(hù)、調(diào)試和重用。
由于全局變量可以在整個驅(qū)動代碼中的任意位置被修改或讀取,這使得程序的行為難以預(yù)測和追蹤。
通過將數(shù)據(jù)封裝到結(jié)構(gòu)體中并使用私有數(shù)據(jù),驅(qū)動的不同部分變得更加模塊化,代碼更易于閱讀和理解,也更容易擴(kuò)展。
在處理某個設(shè)備時,你只需關(guān)注該設(shè)備的私有數(shù)據(jù),而不必?fù)?dān)心其他部分的全局變量如何影響程序。
4
增強(qiáng)安全性
全局變量可能被意外或惡意修改,尤其在復(fù)雜的驅(qū)動程序中,多個模塊之間共享全局變量會增加安全隱患。
使用私有數(shù)據(jù)可以保證每個模塊只能訪問自己的數(shù)據(jù),從而減少出錯或被破壞的可能性。
如果在Linux驅(qū)動中不將全局變量封裝到私有結(jié)構(gòu)體里,可能不會直接導(dǎo)致系統(tǒng)崩潰,但會引發(fā)以下問題:
競態(tài)條件:多線程同時訪問全局變量時,如果沒有加鎖等保護(hù)機(jī)制,可能導(dǎo)致數(shù)據(jù)不一致。
設(shè)備間沖突:多個設(shè)備共享同一個全局變量,設(shè)備A的狀態(tài)可能被設(shè)備B意外修改,導(dǎo)致設(shè)備行為異常。
難以調(diào)試:由于全局變量可以在任意位置被修改,調(diào)試會變得非常困難,難以追蹤這些變量的狀態(tài)變化。
