第三章介紹了乙個以記憶體為裝置的字元裝置驅動。需要注意的是,第三章介紹的只是這個驅動的最基本的四個函式,open release read和write 有了這四個函式,這個驅動也就可以使用了。不過,從書本附帶的原始碼中得到的scull工程的**可遠遠不止這四個函式,它的很多**時為了後面章節的擴充套件。同時,由於核心版本跟作者所使用的核心版本不一致,在編譯這個scull的時候會出現很多的問題,這篇文章介紹了在編譯是可能遇到的問題以及解決方法,必須得感謝這篇文章的作者,我終於成功地把scull編譯出來了。
第四章介紹的是除錯技術,我看的也是模模糊糊的,貌似也沒什麼機會嘗試,打算先進入後面章節的學習,待到用時在回頭補充。這裡提供乙個很給力的文章
這裡介紹了如何使用eclipse和qemu虛擬機器來單步除錯核心,就跟除錯乙個應用程式一樣的。按照步驟,我最終達到效果了。特別提一下,eclipse的版本不要使用最新的3.7,用3.5。在這個地方我可是吃了很大苦頭的。還有就是原始碼存放的路勁盡量不要使用中文。這些都是我的經驗吧。下面就進入第五章了。
第三章的scull工程是很簡單的,它完全沒有考慮併發問題而形成的競態。作為乙個程式設計師,對於併發來說應該是不陌生的,編寫一些應用程式也要考慮程式的併發執行。進而到了linux的裝置驅動程式,併發問題是更加的顯著的。之前就多次提到過,驅動只是提供功能(機制),至於如何使用功能,是由使用者應用程式決定的。這樣也就是說,你的驅動**可能在任意時刻被呼叫,「任何時刻可能發生任何事情」。
回過頭看下scull的write函式:
1if(!dptr
->
data[s_pos]) ;
在裝置驅動的初始化函式中,對每乙個scull裝置進行初始化,同時也包括了每乙個scull裝置的訊號量的初始化:
1for(i =0
; i
<
scull_nr_devs; i
++)
注意,作者給出的原始碼是使用init_mutex巨集,如果由於核心版本原因而無法編譯通過的話,這裡就好改成使用sema_init了,詳情在開頭給出的文章外鏈中有解釋。
在申請共享資料時,要先呼叫p,也就是down_interruptible,如果返回值為負,則說明申請失敗,返回:
1if(down_interruptible(
&dev
->
sem))23
return
-erestartsys;
最後,在完成了訪問資料後,一定要呼叫v,即
1up(&
dev->
sem);
編寫**時應當特別小心,確保即使在出錯後,這個v操作也要執行到,這是非常重要的。
互斥體和訊號量區別
1.互斥量用於執行緒的互斥,訊號量用於執行緒的同步。這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。互斥 是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步 是指在互斥的基礎上 大多數情況 通過其它機制實現訪問者對資...
訊號量和互斥量
1.互斥量用於執行緒的互斥,訊號線用於執行緒的同步。這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。互斥 是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步 是指在互斥的基礎上 大多數情況 通過其它機制實現訪問者對資...
訊號量與自旋鎖 2 訊號量和互斥體
1.引言 下面我們研究如何為共享資源新增鎖定.我們的目的是使所有對共享資源的操作都是原子的,也就是說,在操作該共享資源的其他執行緒執行前,本執行緒對該資源的整個操作就已經完成了.對我們下面要說的記憶體洩露的舉例來說,需要確保當乙個執行緒 如b 發現特定記憶體塊需要分配時,它擁有執行分配的執行權力,並...