Linux 驅動 第二章 構造和執行模組

2021-08-26 19:45:39 字數 4081 閱讀 9808

設定測試系統開發環境及hello world入門模組在前面博文中已經講到,請參考

一,核心模組與應用程式的對比

應用程式:小規模及中規模程式,從頭到尾執行單個任務。

核心模組:預先註冊自己,以便服務於將來的某個請求。然後他的初始化函式就立即結束。

退出時候,應用程式可以不釋放自己申請的資源,而模組在退出之前必須仔細撤銷初始化函式所做的一切。

二,使用者空間和核心空間

模組執行在核心空間,應用程式執行在核心空間應用空間。

每當應用程式執行系統呼叫或者被硬體中斷掛起時,unix將執行模式從使用者空間切換到核心空間。

應用程式在虛擬記憶體中布局,並具有一塊很大的棧空間(儲存函式呼叫歷史以及當前活動函式中的自動變數)。核心具有非常小的棧,所以我們自己的函式必須和整個核心空間呼叫鏈一同共享這個棧。

【注意】在核心api中看到有兩個下劃線_ _的函式名:介面的底層元件

三,初始化和關閉

static int _ _init initialization_function(void)

module_init(initialization_function); //說明核心初始化位置,沒有這個函式,則初始化函式無法呼叫

【注意】_ _init _ _initdata表明函式只在初始化期間使用,模組裝載完成後不再使用。

static void _ _init cleanup_function(void)//沒有返回值

清除函式 類似 module_exit(cleanup_function)

四,初始化過程中的錯誤處理

1)時刻銘記,註冊可能會失敗,因此模組**要始終檢查返回值。

2)當註冊時,有些模組註冊失敗,則需要自行撤銷已註冊的設施。否則核心處於一種不穩定狀態。唯一有效的解決辦法:重新引導系統

3)使用goto

int _ _my_init_function(void)

4)初始化函式還在執行時,核心就完全可能會呼叫我們的模組。所以我們應在用來支援某個設施的所有內部初始化完成之前,不要註冊任何設施。

五,模組引數支援很多態別;

1)基本型別:

bool :布林型別

invbool:顛倒了值的bool型別;

charp :字元指標型別,記憶體為使用者提供的字串分配;

int :整型

long :長整型

short :短整型

uint :無符號整型

ulong :無符號長整型

ushort :無符號短整型

定義模組引數的方法:

module_param(name, type, perm);

其中,name:表示引數的名字;

type:表示引數的型別;

perm:表示引數的訪問許可權;

2)陣列型別:用逗號間隔的列表提供的值;

宣告乙個陣列引數:

module_param_array(name, type, num, perm);

其中,name:表示陣列的名字;

type:表示引數的型別;

num :表示陣列中元素數量;

perm:表示引數的訪問許可權;

3)引數的訪問許可權

modlue_param和module_param_array中的perm用於設定該引數的訪問許可權;

perm表示該引數在sysfs檔案系統中所對應的檔案節點的屬性;你用該使用中定義的許可權值;這個值控制誰可以訪問這些模組引數在sysfs檔案系統中的表示;當perm為0時,表示此引數不存在sysfs檔案系統下對應的檔案節點;否則,模組被載入後,在/sys/module/目錄下將會出現以此模組名命名的目錄,帶有給定的許可權;

比如:#define s_irwxu 00700

#define s_irusr 00400

#define s_iwusr 00200

#define s_ixusr 00100

#define s_irwxg 00070

#define s_irgrp 00040

#define s_iwgrp 00020

#define s_ixgrp 00010

#define s_irwxo 00007

#define s_iroth 00004

#define s_iwoth 00002

#define s_ixoth 00001

注意:如果乙個引數被sysfs修改了,那麼你的模組看到的引數值也被修改了,但是你的模組不會收到任何通知;你應當不要使模組引數可寫,除非你準備好檢測這個改變並因而作出反應;

六,在使用者空間編寫驅動程式

使用者空間驅動程式的優點:

1)可以和整個c庫鏈結

2)驅動程式不用借助外部程式(對於複雜的外設,常常需要和驅動一起發行使用者提供策略的應用程式)就可以完成許多非常規的任務。

3)在驅動中可以使用浮點數

,在某些特殊的硬體中,可能需要使用浮點數,而linux核心並不提供浮點數的支援。如果能在使用者態實現驅動,就可以輕鬆解決這一問題

4) 驅動的問題不會導致整個系統掛起

,有過驅動開發經驗的人一定會對除錯深有感觸,一些錯誤常常導致整個系統掛起。而使用者態的驅動在除錯上就要方便很多。

5) 使用者記憶體可以換出

6)設計良好的驅動仍然可以支援對裝置的併發訪問

7)可以給出封閉原始碼的驅動程式,不必採用gpl

,更為靈活

使用者空間驅動的最常見例子是x-server,很多usb裝置的驅動也可以放到使用者空間。目前,很多人嘗試在使用者態為pci裝置提供驅動

使用者空間驅動的缺點:

1)中斷在使用者空間不可用

,最新的uio介面已經解決了這一問題

2)響應時間較慢

3)只能支援字元裝置,無法支援塊裝置和網路裝置

4)可靠性較低,很多驅動都是閉源的,我們沒法通過閱讀**解決問題

5)有些硬體廠商只提供和某些linux開發版(常常早就過時了)相匹配的使用者空間驅動

第二章 構造和執行模組(筆記)

如果讀者正在編寫乙個只適用於某特定發行版的驅動程式,則應該針對相關核心建立和測試自己的驅動程式。2.6.x核心構造模組,必須在自己的系統中配置並構造好核心樹 因為2.6核心的模組要和核心源 樹中的目標檔案連線 先前的核心只需要一套核心標頭檔案就夠了。module license用來告訴核心,該模組採...

第二章 建構函式

default constructor的構造操作 什麼時候才會合成乙個default construct 當編譯器需要它的時候,此外,被合成出來的 construct 只執行編譯器所需要的行動。nontivial default constructor的 4種情況 1.帶有 default cons...

軟體構造第二章隨筆

1.瀑布模型 要求 設計 實現 驗證 維護 2.增量模型 以增量的方式實施瀑布模型 通常首先實現優先順序最高的需求 當某增量開發完成,則對應的需求被凍結 3.v模型 強調了瀑布模型的測試環節 4原型法 先實現乙個系統原型,模擬最終的幾個方面,甚至完全不同,細節問題可以忽略。在專案早期可以獲得使用者的...