API->設(shè)備驅(qū)動->硬件  比如,在應(yīng)用層,現(xiàn)在使用read函數(shù)去讀取一個設(shè)備文件,這個read函數(shù)是屬于應(yīng)用層的,它..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

驅(qū)動學(xué)習(xí)之字符設(shè)備驅(qū)動的原理

發(fā)布時間:2020-07-03 06:39:23 來源:網(wǎng)絡(luò) 閱讀:595 作者:菜鳥養(yǎng)成記 欄目:開發(fā)技術(shù)

1:嵌入式系統(tǒng)的整體工作原理

  應(yīng)用層->API->設(shè)備驅(qū)動->硬件

  比如,在應(yīng)用層,現(xiàn)在使用read函數(shù)去讀取一個設(shè)備文件,這個read函數(shù)是屬于應(yīng)用層的,它不能直接讀取設(shè)備文件,而是通過內(nèi)核層的函數(shù)(其實就是和file_operations結(jié)構(gòu)體中read這個函數(shù)指針相綁定的函數(shù),這個函數(shù)才是真正操作硬件的函數(shù))來實現(xiàn)讀取文件,


2:file_operations結(jié)構(gòu)體

(1)這個結(jié)構(gòu)體里面存放的是一個驅(qū)動里面操作文件的各種函數(shù)指針,比如,現(xiàn)有一個驅(qū)動,它可以打開一個文件,那么這個驅(qū)動對應(yīng)的fire_operation結(jié)構(gòu)體里面的open函數(shù)指針就和這個驅(qū)動的打開文件的操作函數(shù)相綁定,當(dāng)調(diào)用這個驅(qū)動去打開文件時,就會到這個驅(qū)動的fire_operation結(jié)構(gòu)體中去找到open函數(shù)指針,進而找到驅(qū)動代碼中對應(yīng)的打開文件的函數(shù)。

(2)每個驅(qū)動都有一個fire_operations結(jié)構(gòu)體,用來管理這個驅(qū)動的操作函數(shù)。

(3)設(shè)備驅(qū)動相內(nèi)核注冊時提供該結(jié)構(gòu)體類型的變量。

2:注冊字符驅(qū)動設(shè)備

(1):為什么要注冊:因為注冊后內(nèi)核才能找到這個驅(qū)動

(2):誰去負責(zé)注冊:驅(qū)動自己去注冊

(3)向誰注冊:向內(nèi)核注冊

(4)注冊函數(shù)從哪來:注冊函數(shù)是register_chrdev,有內(nèi)核提供

(5)注冊后的結(jié)果:注冊后內(nèi)核就能記錄這個驅(qū)動的file_operations,將來要用到這個驅(qū)動的時候就可以通過這個驅(qū)動的file_operation來找到相應(yīng)的驅(qū)動。

3:register_chrdev(驅(qū)動注冊函數(shù))

static inline int register_chrdev(unsigned int major,const char *name,const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256 , name, fops);
}


(1)路徑為/include/linux/fs.h,所以以后使用的時候需要添加#include<linux/fd.h>

(2)作用:驅(qū)動向內(nèi)核注冊自己的file_operations

(3)返回值:注冊成功返回0,注冊失敗返回一個負整數(shù)

(4)參數(shù)

  unsigned int major:主設(shè)備號,主設(shè)備號是內(nèi)核或者自己給設(shè)備(硬件)定義的編號,將來要操作這個硬件的時候只要去調(diào)用這個編號(范圍是0-255)就行。這設(shè)備號可以有內(nèi)核自動分配,也可以由程序員自己指定,假如自己指定的編號比如是38已經(jīng)被占用了,那么file_operations就會返回一個負整數(shù),注冊失敗。

  const char *name:當(dāng)前設(shè)備驅(qū)動的名字,便于程序員查看這個驅(qū)動的具體作用。

  const struct file_operations *fops:把這個驅(qū)動的file_operations結(jié)構(gòu)體變量傳給內(nèi)核,用于注冊這個驅(qū)動。

(5)static:為了防止和其他文件的函數(shù)重名

(6)inline:這個函數(shù)是定義在頭文件中的,在預(yù)處理的時候頭文件內(nèi)容是在.c文件中原地展開的,所以當(dāng)有多個.c文件調(diào)用這個頭文件中時就會提示重復(fù)定義的錯誤。另一個原因是,這個函數(shù)的內(nèi)容很短,使用inline就可以減少函數(shù)調(diào)用的開銷,提高函數(shù)調(diào)用的速度。


4:內(nèi)核如何管理字符設(shè)備驅(qū)動

(1)內(nèi)核張有一個數(shù)組用來存儲注冊的字符設(shè)備驅(qū)動

(2)register_chrdev內(nèi)部將我們要注冊的驅(qū)動信息(主要是)存儲在書中中相應(yīng)的位置中

(3)使用cat /proc/devices去查看當(dāng)前系統(tǒng)中已經(jīng)注冊的設(shè)備

5:proc文件系統(tǒng)

(1)/proc 文件系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來向進程(process) 發(fā)送信息的機制(所以叫做/proc)。這個偽文件系統(tǒng)讓你可以和內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)進行交互,獲取 有關(guān)進程的有用信息,在運行中(on the fly) 改變設(shè)置(通過改變內(nèi)核參數(shù))。 與其他文件系統(tǒng)不同,/proc 存在于內(nèi)存之中而不是硬盤上。如果你察看文件/proc/mounts (和mount 命令一樣列出所有已經(jīng)加載的文件系統(tǒng)),你會看到其中 一行是這樣的:

grep proc /proc/mounts

/proc /proc proc rw 0 0

/proc 由內(nèi)核控制,沒有承載/proc 的設(shè)備。因為/proc 主要存放由內(nèi)核控制的狀態(tài)信息,所以大部分這些信息的邏輯位置位于內(nèi)核控制的內(nèi)存。對/proc 進行一次'ls -l' 可以看到大部分文件都是0 字節(jié)大的;不過察看這些文件的時候,確實可以看到一些信息。這怎么可能?這是因為/proc 文件系統(tǒng)和其他常規(guī)的文件系統(tǒng)一樣把自己注冊到虛擬文件系統(tǒng)層(VFS) 了。然而,直到當(dāng)VFS 調(diào)用它,請求文件、目錄的 i-node 的時候,/proc 文件系統(tǒng)才根據(jù)內(nèi)核中的信息建立相應(yīng)的文件和目錄。

(2)加載proc 文件系統(tǒng)

如果系統(tǒng)中還沒有加載proc 文件系統(tǒng),可以通過如下命令加載proc 文件系統(tǒng):

mount -t proc proc /proc

上述命令將成功加載你的proc 文件系統(tǒng)。更多細節(jié)請閱讀mount 命令的man page。

(3)察看/proc 的文件

/proc 的文件可以用于訪問有關(guān)內(nèi)核的狀態(tài)、計算機的屬性、正在運行的進程的狀態(tài)等信息。大部分/proc 中的文件和目錄提供系統(tǒng)物理環(huán)境最新的信息。盡管/proc 中的文件是虛擬的,但它們?nèi)钥梢允褂萌魏挝募庉嬈骰蛳?more', 'less'或'cat'這樣的程序來查看。當(dāng)編輯程序試圖打開一個虛擬文件時,這個文件就通過內(nèi)核中的信息被憑空地(on the fly) 創(chuàng)建了。這是一些我從我的系統(tǒng)中得到的一些有趣結(jié)果

參考

http://www.2cto.com/os/201202/119552.html






向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI