**:
應用層和驅動的銜接,一直是乙個老大難問題,若弄不清楚,總覺得驅動寫起來似是而非的。下面就說說我對他們的理解,還有就是如何實現乙個驅動支援多個上裝置的問題。
最主要涉及兩個機制:inode和file。
在驅動中:
(1)、我們先找到乙個裝置號devno,可以動態申請,也可以靜態設定,假設靜態設定為major,minor,通過巨集mkdev(major,minor)來生成devno
(2)、構建對裝置的操作函式file_opreation結構體,裡面包含了的裝置的操作:open、read、write、release、ioctl等
(3)、構建cdev結構體,裡面填充兩個主要成員dev(裝置號)、file_operation(對裝置的操作)
(4)、把cdev新增的cdev鍊錶中:cdev_init、cdev_add
應用程式中:
fd=open("/dev/hello",o_rdwr)來開啟裝置檔案,此裝置節點對應有乙個裝置號,這是我們識別驅動和裝置的橋梁。
開啟 /dev/hello時,根據裝置號,在cdev鍊錶中找到cdev這個結構體,cdev裡面包含了file_operation結構體,有裝置的各種操作,開啟時就呼叫裡面的.open 函式。在這裡要完成幾件事:
(1)inode節點 每乙個檔案都對應有乙個inode節點,inode結構體裡.i_fop由cdev的file_operation填充,i_dev由cdev的裝置號填充
(2)file結構體中的file_operation也同樣由cdev中對應項填充,還有一項fd,對應於開啟檔案的檔案描述符,fd和file一一對應,檔案每開啟一次,就有乙個file結構體。所以file裡面的.private就很重要,下面會說到。
還有乙個問題,那就是多個相同的裝置,會公用同乙個驅動,所以要把每乙個裝置的私有資料封裝起來,構成乙個私有資料結構體。對裝置的每一次讀寫,都通過操作裝置的私有資料結構體中的資源來完成。也就是說,驅動在載入的時候,會申請多個裝置私有資源結構體,每個結構體中包含了裝置的所有私有資源,雖然公用乙個驅動,可是通過裝置號找到此裝置號對應裝置的私有資源,說的有點拗口。這可以通過file結構體的.private來指向。
例如封裝私有資料的結構體為:
struct hello_device{
char buf[128]; //裝置的私有資源,譬如buf
struct cdev cdev;//裝置結構體,裡面有devno和file_operation
前面應經提到inode中的i_cdev會指向cdev結構,所以可以由container巨集來得到hello_device的位址。
所以,在驅動的open函式中有兩個引數,inode和file
int open(structc inode *inode,struct file *file){
struct hello_device *p =container(inode->i_cdev,hello_struct,cdev)
file->private=p;
這樣file中就包含了裝置的私有資料。
驅動read函式中:
ssize_t read(fd,char __user *buf,count)
fd和file一一對應,每開啟一次裝置,雖然有不同的fd,但他們的file.private是一樣的。
前面主要說了乙個驅動如何可以支援多個裝置的問題,以及應用層和驅動之間的聯絡。還有乙個問題就是,如何處理過個程序訪問同乙個裝置的問題。
診斷網路層和應用層互動 傳輸層 應用層
計算機1 計算機2 應用層 應用層 傳輸層 段 傳輸層 網路層 包 網路層 資料鏈路層 幀 資料鏈路層 物理層 物理層 位ethernet頭 ip頭 tcp頭 應用層的頭 應用層資料 那麼我們通過ip和mac找到了一台特定的主機,如何標識這台主機上的應用程式,答案就是埠,埠即應用程式與網絡卡關聯的編...
表示層 應用層
表示層 功能 為異種機通訊提供一種公共語言,以便能進行互操作。這種型別的服務之所以需要,是因為不同的計算機體系結構使用的資料表示法不同。例如,ibm主機使用ebcdic編碼,而大部分pc機使用的是ascii碼。在這種情況下,便需要表示層來完成這種轉換。應用層 包含了通常要使用的協議 http協議 超...
應用層協議
應用層協議定義了執行在不同端系統上的應用程式程序如何相互傳遞訊息。特別是定義了 交換的訊息型別,如請求訊息和響應訊息。各種訊息型別的語法,如訊息中的各個字段及其詳細描述。欄位的語義,即包含在字段中的資訊的含義。程序何時 如何傳送訊息及對訊息進行響應的規則。有些應用層協議是由rfc文件定義的,因此它們...