1:嵌入式系統的整體工作原理
應用層->API->裝置驅動->硬體
比如,在應用層,現在使用read函數去讀取一個裝置檔案,這個read函數是屬于應用層的,它不能直接讀取裝置檔案,而是通過核心層的函數(其實就是和file_operations結構體中read這個函數指針相綁定的函數,這個函數才是真正操作硬體的函數)來實作讀取檔案,
2:file_operations結構體
(1)這個結構體裡面存放的是一個驅動裡面操作檔案的各種函數指針,比如,現有一個驅動,它可以打開一個檔案,那麼這個驅動對應的fire_operation結構體裡面的open函數指針就和這個驅動的打開檔案的操作函數相綁定,當調用這個驅動去打開檔案時,就會到這個驅動的fire_operation結構體中去找到open函數指針,進而找到驅動代碼中對應的打開檔案的函數。
(2)每個驅動都有一個fire_operations結構體,用來管理這個驅動的操作函數。
(3)裝置驅動相核心注冊時提供該結構體類型的變量。
2:注冊字元驅動裝置
(1):為什麼要注冊:因為注冊後核心才能找到這個驅動
(2):誰去負責注冊:驅動自己去注冊
(3)向誰注冊:向核心注冊
(4)注冊函數從哪來:注冊函數是register_chrdev,有核心提供
(5)注冊後的結果:注冊後核心就能記錄這個驅動的file_operations,将來要用到這個驅動的時候就可以通過這個驅動的file_operation來找到相應的驅動。
3:register_chrdev(驅動注冊函數)
<code>static</code> <code>inline</code> <code>int</code> <code>register_chrdev(unsigned </code><code>int</code> <code>major,</code><code>const</code> <code>char</code> <code>*name,</code><code>const</code> <code>struct</code> <code>file_operations *fops)</code>
<code>{</code>
<code>return</code> <code>__register_chrdev(major, 0, 256 , name, fops);</code>
<code>}</code>
(1)路徑為/include/linux/fs.h,是以以後使用的時候需要添加#include<linux/fd.h>
(2)作用:驅動向核心注冊自己的file_operations
(3)傳回值:注冊成功傳回0,注冊失敗傳回一個負整數
(4)參數
unsigned int major:主裝置号,主裝置号是核心或者自己給裝置(硬體)定義的編号,将來要操作這個硬體的時候隻要去調用這個編号(範圍是0-255)就行。這裝置号可以有核心自動配置設定,也可以由程式員自己指定,假如自己指定的編号比如是38已經被占用了,那麼file_operations就會傳回一個負整數,注冊失敗。
const char *name:目前裝置驅動的名字,便于程式員檢視這個驅動的具體作用。
const struct file_operations *fops:把這個驅動的file_operations結構體變量傳給核心,用于注冊這個驅動。
(5)static:為了防止和其他檔案的函數重名
(6)inline:這個函數是定義在頭檔案中的,在預處理的時候頭檔案内容是在.c檔案中原地展開的,是以當有多個.c檔案調用這個頭檔案中時就會提示重複定義的錯誤。另一個原因是,這個函數的内容很短,使用inline就可以減少函數調用的開銷,提高函數調用的速度。
4:核心如何管理字元裝置驅動
(1)核心張有一個數組用來存儲注冊的字元裝置驅動
(2)register_chrdev内部将我們要注冊的驅動資訊(主要是)存儲在書中中相應的位置中
(3)使用cat /proc/devices去檢視目前系統中已經注冊的裝置
5:proc檔案系統
(1)/proc 檔案系統是一種核心和核心子產品用來向程序(process) 發送資訊的機制(是以叫做/proc)。這個僞檔案系統讓你可以和核心内部資料結構進行互動,擷取 有關程序的有用資訊,在運作中(on the fly) 改變設定(通過改變核心參數)。 與其他檔案系統不同,/proc 存在于記憶體之中而不是硬碟上。如果你察看檔案/proc/mounts (和mount 指令一樣列出所有已經加載的檔案系統),你會看到其中 一行是這樣的:
grep proc /proc/mounts
/proc /proc proc rw 0 0
/proc 由核心控制,沒有承載/proc 的裝置。因為/proc 主要存放由核心控制的狀态資訊,是以大部分這些資訊的邏輯位置位于核心控制的記憶體。對/proc 進行一次'ls -l' 可以看到大部分檔案都是0 位元組大的;不過察看這些檔案的時候,确實可以看到一些資訊。這怎麼可能?這是因為/proc 檔案系統和其他正常的檔案系統一樣把自己注冊到虛拟檔案系統層(VFS) 了。然而,直到當VFS 調用它,請求檔案、目錄的 i-node 的時候,/proc 檔案系統才根據核心中的資訊建立相應的檔案和目錄。
(2)加載proc 檔案系統
如果系統中還沒有加載proc 檔案系統,可以通過如下指令加載proc 檔案系統:
mount -t proc proc /proc
上述指令将成功加載你的proc 檔案系統。更多細節請閱讀mount 指令的man page。
(3)察看/proc 的檔案
/proc 的檔案可以用于通路有關核心的狀态、計算機的屬性、正在運作的程序的狀态等資訊。大部分/proc 中的檔案和目錄提供系統實體環境最新的資訊。盡管/proc 中的檔案是虛拟的,但它們仍可以使用任何檔案編輯器或像'more', 'less'或'cat'這樣的程式來檢視。當編輯程式試圖打開一個虛拟檔案時,這個檔案就通過核心中的資訊被憑空地(on the fly) 建立了。這是一些我從我的系統中得到的一些有趣結果
參考
<a href="http://www.2cto.com/os/201202/119552.html" target="_blank">http://www.2cto.com/os/201202/119552.html</a>
本文轉自 菜鳥養成記 51CTO部落格,原文連結:http://blog.51cto.com/11674570/1872407