首先,個人感覺裝置驅動程式與應用程式中的檔案操作隔得有點遠,使用者空間不論是直接使用系統呼叫還是庫函式都是通過系統呼叫的介面進入核心空間**的。但是看過乙個部落格的分析整個過程,感覺中間層太過麻煩,必須經過虛擬檔案系統才能真正到達驅動部分,對與我這個新手來說確實讀不了整個過程的**,沒辦法真正理解真個過程的明細。所以就從表面上看看系統呼叫跟驅動程式是怎樣連線起來的。
就拿ldd3上面用記憶體模擬字元裝置的例子來理解。
首先我們要動態分配乙個可用的裝置號,這個裝置號包括主裝置和從裝置號。(假定是250.0,250是主,0是從,運氣不好總是分到250凸-。-凸)裝置號是繫結很多東西的紐帶。
在得到裝置號之後,我們建立了乙個cdev變數,該變數在核心裡用來表示乙個裝置,在初始化時,我們就將裝置號填寫到了該結構體中。也就是說我們在核心裡搞到乙個裝置,上面寫著250.0 。除了給這個裝置結構體乙個號碼以外,還需要給它一組操作,告訴他遇到特定的命令,這個裝置該怎麼做。也就是file_operation
另外還有乙個重點就是裝置檔案,在/dev/下建立,建立語法mknod name c 主 從。這個語句也透露了玄機,我們的裝置檔案是和乙個裝置結構體一一對應的。
然後就不難理解了系統呼叫了是怎麼跟裝置驅動聯絡起來的了,系統呼叫操作裝置檔案,根據裝置檔案的裝置號資訊,我們就到核心中去發現有該裝置號的裝置結構體,結構體裡面有對應該系統呼叫的操作實體,就操作就行了。
除此之外還有兩點非常重要就是傳遞給驅動的那兩個引數,指向file的指標和指向inode的指標。inode是核心中表示檔案的東西,應該是始終存在在核心中的吧,而file結構體是對應與inode表示開啟的檔案的。乙個檔案只有乙個inode,但可以有多個file,驅動程式中的引數是自動又系統傳值的吧。
這就是個人對裝置驅動的一些理解,沒看過原始碼,不能保證,細節部分基本沒有,只為方便理解而已,希望有幫助。
進一步理解。
在更仔細閱讀了ldd之後,對這個問題有了新的認識。
1.在核心中使用cdev結構體表示乙個裝置,內部有兩個重要的成員就是裝置號和file_operations這兩個還是能比較充分地體現裝置的資訊,然後通過內部的listhead指標可以幫助裝置串到鍊錶中去,cdev_add函式所謂註冊裝置,也就是將節點加入到裝置鍊錶中去。
2.開啟乙個裝置檔案的時候,根據檔案的裝置號搜尋鍊錶,找到相應的cdev結構。然後我們就用cdev結構裡的成員去填充inode和file結構。比如說inode裡的裝置號和cdev指標,file中的f_op
除此之外還有幾句關鍵句:file結構由核心在open時建立,並傳遞給在該檔案上進行操作的所有函式。
file中的f_pos當前的讀寫位置,讀寫操作會使用它們接收到的最後那個指標引數來更新這一位置。
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...
Linux裝置驅動程式
linux系統中的裝置分為字元裝置 char device 塊裝置 block 和網路裝置 net device 三種,字元裝置是指在訪問時沒有快取,能夠像檔案一樣被訪問的裝置,字元裝置驅動程式至少要實現open close read和write系統呼叫。多數的linux裝置驅動程式可以在核心模組發...