Linux裝置驅動

2021-08-31 09:47:21 字數 2502 閱讀 6955

本次來分享下我在linux裝置驅動這裡的學習收穫。

首先要區分一下裝置驅動,和裝置驅動程式,在我的理解中,裝置驅動是核心層面面向資料結構的概念;而裝置驅動程式則是分為字元裝置,i/o裝置等的程式,這個裡面定義並實現了我們使用者在寫程式時所使用的open(),write()等的函式;再往下一層則是具體的物理裝置和我們平時所書寫的驅動物理裝置的程式。所以裝置驅動程式可以分為兩類,一類是字元裝置,i/o裝置,塊裝置這三種大的分類,他們定義了open(),write()等的基本函式,另一類就是具體裝置的驅動程式,這些一般都是開發人員來寫,在使用基本函式的基礎上進行裝置驅動開發,在最後給與使用者乙個整合的裝置驅動函式介面。我一開始這些還有些分不清,不過在讀原始碼之後有了一些理解,如果有不足的地方,希望能夠得到指正。

這裡我主要根據裝置驅動程式的資料結構來入手,linux下的裝置驅動程式最重要的幾個資料結構是file,file_operations,和inode。它們都在核心中include/linux/fs.h檔案中,這裡需要說明下,檔案系統相關的幾個資料結構也都在這裡面,這時就可以看出linux核心的知識實際上是統合在一起的,書本上的是人為劃分,學習時一定要看原始碼,就可以將書本上的學習內容鏈結起來,原來我以為檔案系統和驅動程式的資料結構是分開的,沒想到找半天在乙個檔案中。(ps:dentry資料機構在dcache.h檔案中,至於為什麼沒有和其他三個資料結構在一起我還沒有搞清,不過fs.h檔案的標頭檔案包括了dcache,所以在執行的時候並不影響)下面是fs.h檔案中的file,file_operations和inode資料結構:

struct file ;

struct file_operations ;

struct inode ;

這裡我們可以看到file中會有file_operations和inode的呼叫,而在file_operations中我們可以看到這個結構中基本都是各個驅動程式可能會用到的函式介面,例如常用到的read,write,open,而在inode則是檔案系統中的索引節點,存放了處理檔案所需要的所有資訊,並且有指標指向超級塊結構。這裡就可以看出linux裝置驅動程式的思想,它把所有裝置都當做檔案,分配檔案所需要的索引節點等一切東西,操作時則是和檔案一樣,分配file_operations,這裡面有檔案操作程式。大概的流程圖如下。

可以看出整個流程是使用者->檔案系統->裝置驅動程式->裝置控制器->物理裝置

file用來鏈結檔案系統和裝置驅動程式

這裡就會有問題了,首先是能不能繞過file,直接將inode和file_operations鏈結起來,比如在嵌入式的簡單作業系統中,裝置檔案都比較少。答案當然是不能,原因也很簡單,就是只要操作檔案,就會呼叫file,除非直接不用linux使用的vfs檔案結構,不過改了之後可能就不是linux了哈。另外在這個檔案中我們也可以發現,super_block有super_block_operations,inode有inode_operations,可以看出裝置啟動程式呼叫了file結構和它的file_operations,和而在file結構中本身的檔案結構就呼叫了inode結構,裝置驅動程式直接就順著inode鏈結起來了裝置和檔案,可以說裝置驅動程式操作也就是檔案系統的範疇。

下面還有問題就是,作業系統中存在這麼多驅動程式,我咋知道我這個裝置就是呼叫相應的驅動?或者說我現在在作業系統中安裝了乙個驅動,那麼我操作原來的檔案會不會用新驅動裡的函式來操作?答案當然是不會,這裡就有乙個操作 mknod /dev/*** c yyy 0;這裡面mknod命令大家自己查查,我就說下這個命令的作用,其中/dev/***是裝置對映到檔案系統中的檔案,yyy是裝置的主裝置號,c是字元裝置,命令的意思就是將裝置鏈結到yyy裝置號上。下面有一段程式

module_license("gpl");

#define mycdev_major 231 //cat /proc/devices檢視系統中未使用的字元裝置主裝置號

#define mycdev_size 1024

程式中#define mycdev_major 231就是定義了主裝置號,這個程式就是乙個驅動程式的部分,可以看出231這個裝置號就是連線驅動和裝置的橋梁,一般的檔案或者裝置呼叫預設的驅動,而自己加入的驅動就要和相應的裝置鏈結起來。

這裡有個例子

kecheng程式訪問的是globa檔案,呼叫的是globalmem驅動,kecheng1程式訪問的是mycdev檔案,呼叫的是mycdev驅動。我的理解是在上面建立檔案節點的工作中就將檔案和驅動鏈結起來的,通過檔案節點231(mycdev)或者230(globa),所以呼叫的驅動是對應的,所以在自己寫驅動時,除了要將裝置對映到目錄下成為乙個檔案之外,還要分配特定的檔案節點鏈結檔案和驅動。

關於裝置驅動我的理解現在就是這樣,裝置驅動程式說道理是檔案操作,還是屬於檔案系統的範疇,在學習時,還是要打破書中的章節界限,那只是人為的劃分,在原始碼中都是綜合在一起的。

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動

一.簡介 作業系統是通過各種驅動程式來駕馭硬體裝置,它為使用者遮蔽了各種各樣的裝置,驅動硬體是作業系統最基本的功能,並且提供統一的操作方式。正如我們檢視螢幕上的文件時,不用去管到底使用nvidia晶元,還是ati晶元的顯示卡,只需知道輸入命令後,需要的文字就顯示在螢幕上。硬體驅動程式是作業系統最基本...

linux裝置驅動

1 flash的程式設計原理都是只能將1寫為0,而不能將0寫為1。所以在flash程式設計之前,必須將對應的塊擦除,而擦除的過程就是把所有位都寫為1的過程,塊內的所有位元組變為0xff。2 nand flash與nor flash相比容量大 低 nand flash中每個塊的最大擦寫次數是100萬次...