linux驅動 字元裝置解析

2021-10-09 03:53:35 字數 2235 閱讀 1392

linux字元裝置驅動學的是雲裡霧裡,一團亂麻,剪不斷理還亂… 放棄?

不,反正閒著也是閒著,打王者還老遇到坑,免不了上火!

那就一點一點來吧,弄一點是一點

開始可能很多同學跟我一樣,從**入手,點亮乙個led,急於看到結果,然後一頓操作猛如虎,驅動學的特別苦,面試一問二百五!

因此,現在我想改變下策略,從基本概念開始,不急著去寫**,先去了解下字元裝置驅動框架,然後去弄懂如下幾個概念:

1、啥是裝置號,用來幹嘛的

2、file_operations結構體的作用

3、cdev是啥

上面這三個應該就是字元裝置驅動的關鍵了,把它們弄熟了才能更好的編寫字元裝置驅動

字元裝置是linux三大裝置之一,另外兩種我就不提了,字元裝置就是位元組流形式通訊的i/o裝置,絕大部分裝置都是字元裝置,所以學好它是我們嵌入式開發人員勢在必行的

常見的字元裝置包括滑鼠、鍵盤、顯示器、串列埠等,用ls -l /dev指令可以檢視很多裝置檔案,c就是字元裝置, 後面的數值就是主裝置號和次裝置號,這個特別重要

裝置號又分為主裝置號和次裝置號

主裝置號用來區分不同硬體裝置型別,如串列埠和usb之間的區別,表示對應的驅動程式,也就是說乙個主裝置號對應乙個驅動程式。

次裝置號用來區分同一型別的多個裝置,如串列埠1和串列埠2之間的區別,由核心使用,用於確定/dev下的裝置檔案對應的具體裝置。

如下:各檔案主裝置號一致,次裝置號不同

作用:因為linux下兼檔案。各種裝置都以檔案的形式存放在/dev目錄下,稱為裝置檔案

應用程式可以開啟、關閉和讀寫這些裝置檔案,完成對裝置的操作,就像操作普通的資料檔案一樣。為了管理這些裝置,系統為裝置編了

號,所以每個裝置號就分為了主裝置號和次裝置號。

其中與裝置號相關的比較重要的三個巨集,**中盡量使用巨集,減少相容性問題

#

define

major

(dev)

((dev)

>>8)

#define

minor

(dev)

((dev)

&0xff)#

define

mkdev

(ma,mi)

((ma)

<<8|

(mi)

)

file_operations結構體是字元裝置驅動與核心的介面,是使用者空間對linux進行系統呼叫最終的落實者, 這個結構體包含對檔案開啟,關閉,讀寫,控制的一系列成員函式。

//結構體定義如下:

static

struct

file_operations chrdev_fops =

;

cdev是字元裝置物件結構體,是linux用來管理字元裝置的,其在核心中採用陣列結構設計,這樣系統中有多少個主裝置號就約定了陣列大小,此裝置號採用鍊錶管理,同一主裝置號下可以有多個子裝置。

cdev 結構體中包含 裝置號 dev_t 和 file_operations 結構指標

struct

cdev

;

擴充套件:應用程式是怎麼跟驅動程式產生聯絡的呢,比如open函式,其呼叫大致過程如下:

1、應用程式open開啟乙個裝置節點檔案:int open("/dev/text", o_rdwr);

2、會產生open系統呼叫,然後進入核心,呼叫sys_open函式,就直接到vfs層了,並產生struct file表示乙個開啟的檔案

3、然後vfs虛檔案系統open根據傳進來的路徑轉換為inode,通過 inode 節點獲取到檔案裝置號

4、遍歷 cdev 鍊錶,與此檔案的裝置號進行比較,如果相同則表示匹配成功

5、將匹配成功的 cdev 結構體中的 file_operations 賦值給此檔案的 struct file,從而關聯到驅動層中的file_operations

6、最後根據file_operations中函式指標就可以找到該結構體中對該種檔案操作的所有方法

大致過程就是:應用層open --> 系統呼叫sys_open --> vfs層 --> 得到inode --> 獲取裝置號 --> 遍歷cdev --> 裝置號匹配就進行關聯

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

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

Linux裝置驅動之《字元裝置驅動》

linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...

Linux裝置驅動之字元裝置驅動

一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...