驅動 linux裝置驅動 掃盲

2021-09-06 10:41:52 字數 4435 閱讀 1143

linux裝置驅動

linux系統把裝置驅動分成字元裝置、塊裝置和網路裝置三種型別。

核心為裝置驅動提供了註冊和管理的介面,裝置驅動還可以使用核心提供的其他功能以及訪問核心資源。

pci區域性匯流排

早期的計算機有眾多匯流排標準。從最初的8位匯流排到16位匯流排,到目前主流的32位匯流排,不同廠商都制定了自己的匯流排標準。不同的匯流排裝置給裝置驅動的設計帶了麻煩,直到後來pci區域性匯流排出台這種局面才得到緩解,並且逐步成為事實上的標準。

pci是英文peripheral component interconnect的縮寫,中文意思是外設部件互連標準。

pci區域性匯流排標準最早由英特爾公司為制定,最初主要應用在pc機。目前已經被越來越多的嵌入式系統已經其他型別的計算機系統使用。

設計pci的原因是由於之前的匯流排有許多的缺點,歸納總結為以下幾點:

pci匯流排採用軟體配置位址和其它匯流排資訊的方法,避免了手工配置裝置在匯流排位址帶來的麻煩,此外,pci還支援通過橋的方式擴充套件匯流排的處理能力。

linux裝置驅動基本概念

在linux系統中,所有的資源都是作為檔案管理的,裝置驅動也不例外,裝置驅動通常是作為一類特殊的檔案存放在/dev目錄下。

total 0

crw------- 1 root root 10, 58 jun 8 11:40 alarm

crw------- 1 root root 10, 59 jun 8 11:40 ashmem

crw------t 1 root root 10, 235 jun 8 11:40 autofs

crw------- 1 root root 10, 60 jun 8 11:40 binder

drwxr-xr-x 2 root root 740 jun 8 2013 block

drwxr-xr-x 2 root root 80 jun 8 2013 bsg

crw------t 1 root root 10, 234 jun 8 11:40 btrfs-control

drwxr-xr-x 3 root root 60 jun 8 2013 bus

lrwxrwxrwx 1 root root 3 jun 8 11:40 cdrom -> sr0

lrwxrwxrwx 1 root root 3 jun 8 11:40 cdrw -> sr0

drwxr-xr-x 2 root root 3700 jun 8 11:40 char

crw------- 1 root root 5, 1 jun 8 11:40 console

lrwxrwxrwx 1 root root 11 jun 8 11:40 core -> /proc/kcore

drwxr-xr-x 2 root root 60 jun 8 11:40 cpu

crw------- 1 root root 10, 57 jun 8 11:40 cpu_dma_latency

drwxr-xr-x 6 root root 120 jun 8 2013 disk

這裡僅列出了一部分檔案,裝置檔案屬性最開始的乙個字元c表示該裝置檔案關聯的是乙個字元裝置;b表示關聯的是乙個塊裝置。在檔案列表的中間部分有兩個數字,第乙個數字稱做主裝置號,第二個數字稱做次裝置號。

在核心中使用主裝置號標識乙個裝置,次裝置號提供給裝置驅動使用。

在打工乙個裝置的時候,核心會根據裝置的主裝置號得到裝置驅動,並且把次裝置傳遞給驅動。linux核心為所有裝置都分配了主裝置號,在編寫驅動程式之前需要參考核心**documentation/devices.txt檔案,確保使用的裝置號沒有被占用。

在使用乙個裝置之前,需要使用linux提供的mknod命令建立裝置檔案。mknod命令格式如下

mknod [option] ... name type [major minor]
其中,name是裝置檔名稱;type是裝置型別,c**字元裝置,b代表塊裝置;major是主裝置號,minor是次裝置號。option是選項,-m引數用於指定裝置檔案訪問許可權。

linux核心按照外部裝置工作特點把裝置分成了字元裝置、塊裝置和網路裝置3種基本型別。

在編寫裝置驅動的時候,需要使用核心提供的裝置驅動介面,向核心提供具體裝置的操作方法。

字元裝置

字元裝置是linux系統最簡單的一類裝置。

應用程式可以像操作普通檔案一樣操作字元裝置。常見的串列埠、數據機都是字元裝置。

編寫字元裝置驅動需要使用核心提供的register_chardev()函式註冊乙個字元裝置驅動。

函式定義如下:

int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
fops是指向函式指標陣列的結構指標,驅動程式的入口函式都包括在這個指標內部。    

該函式的返回值如果小於0表示註冊裝置驅動失敗,如果設定major為0,表示由核心動態分配主裝置號,函式的返回值是主裝置號。    

當使用register_chardve()函式成功註冊乙個字元裝置後,會在/proc/devices檔案中顯示出裝置資訊

mystery@lcw:~$ cat /proc/devices

character devices:

1 mem

4 /dev/vc/0

4 tty

4 ttys

7 vcs

10 misc

13 input

21 sg

29 fb

99 ppdev

108 ppp

253 watchdog

254 rtc

block devices:

1 ramdisk

259 blkext

7 loop

8 sd

9 md

253 virtblk

254 mdp

刪除了一些,其中character devices是字元裝置驅動列表,block devices是塊裝置驅動列表,數字代表主裝置驅動,後面是裝置驅動名稱。

與註冊驅動相反,核心提供了unregister_chardev()函式解除安裝裝置驅動or

int unregister_chrdev(unsigned int major, const char *name);
核心會比較裝置驅動名稱與裝置號是否相同,如果不同函式返回-einval。錯誤地解除安裝裝置驅動會帶來嚴重後果,因此在解除安裝驅動的時候應該對函式返回值做判斷。

在register_chardev()函式中有乙個fops引數,該引數指向乙個file_operation結構,該結構包含了驅動上的所有操作。隨著核心功能的不斷增加,file_operations結構的定義也越來越複雜。

大部分驅動都沒有提供所有的函式,對於字元裝置來說,常用的函式如下

塊裝置

與字元裝置相比,塊裝置要複雜的多。

最主要的差別是塊裝置帶有緩衝,字元裝置沒有。

塊裝置傳輸資料只能以塊作為單位讀寫,字元裝置是以位元組作為最小讀寫單位的。塊裝置對於i/o請求有對應的緩衝區,可以選擇響應的順序,如採用特定的排程策略等;字元裝置只能順序訪問。

此外,塊裝置提供了隨機訪問的能力,而字元裝置之順序讀取資料。

塊裝置提供了乙個類似字元裝置的訪問函式結構block_device_operations,定義如下

struct block_device_operations

;

其中,open、release、ioctl等函式的功能與字元裝置相同。

塊裝置提供了幾個特有的函式成員:

網路裝置

在linux核心中,網路裝置是一類特殊的裝置,因此被單獨設計為一種型別的驅動。

與其他裝置不同的是,網路裝置不是通過裝置檔案訪問的,在/dev目錄下不會看到任何網路裝置。因此,網路裝置的操作不是通過檔案操作實現的。

linux核心為了抽象網路裝置介面,為其定義了乙個介面用於遮蔽網路環境下各種網路裝置的差別。核心對所有網路裝置的訪問都通過這個抽象的介面,介面對上層網路協議提供相同的操作方法。

本文出自 「成鵬致遠」 部落格,請務必保留此出處

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

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

Linux裝置驅動 SPI驅動

spi驅動匯流排架構 spi核心層 x spi控制器驅動層 x spi裝置驅動層 spi函式介面 api 簡單介紹spi協議,硬體原理 4412datasheet sdi 資料輸入buf i2c scl6 sdo 資料輸出buf i2c sda6 sclk 時鐘buf gpc1 1 cs 片選bk ...

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

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