Linux驅動模組基礎

2021-05-28 17:56:44 字數 1526 閱讀 4026

1、模組載入函式

linux核心模組載入函式一般以__init標識宣告,典型的模組載入函式的形式如下:

static int __init initialization_function(void)

module_init(initialization_function);

模組載入函式必須以「module_init(函式名)」的形式被指定。它返回整型值,若初始化成功,應返回0。而在初始化失敗時,應該返回錯誤編碼。

2、模組解除安裝函式

linux核心模組解除安裝函式一般以__exit標識宣告,典型的模組解除安裝函式的形式如下:

static void __exit cleanup_function(void)

module_exit(cleanup_function);

模組解除安裝函式在模組解除安裝的時候執行,不返回任何值,必須以「module_exit(函式名)」的形式來指定。

通常來說,模組解除安裝函式要完成與模組載入函式相反的功能,如下:

a、如模組載入函式註冊了***,則模組解除安裝函式應該登出***;

b、若模組載入函式動態申請了記憶體,則模組解除安裝函式應該釋放改記憶體;

c、若模組載入函式申請了硬體資源(中斷、dma通道、io埠和io記憶體等)的占用,則模組解除安裝函式應釋放這些硬體資源。

d、若模組載入函式開啟了硬體,則解除安裝函式中一般要關閉硬體。

__init 和 __exit都是巨集,其定義分別如下:

#define __init __attribute__ ((__section__(".init.text")))

#define __exit __attribute__ ((__section__(".exit.text")))

3、模組引數

可以用「module_param(引數名,引數型別,引數讀/寫許可權)」為模組定義乙個引數,例如下列**定義了乙個整型引數和乙個字元指標引數。

static char * book_name = "1232412";

static int num = 12323;

module_param(num ,int , s_irugo);

module_param(book_name , charp , s_irugo);

在裝載核心模組時,使用者可以向模組傳遞引數,形式為「insmode (或modprobe) 模組名 引數名 = 引數值」,如果不傳遞,引數將使用模組內定義的預設值。

4、模組宣告與描述

在linux核心模組中,我們可以用module_author、module_description、module_version、module_device_table、module_alisa分別宣告模組的作者,描述,版本,裝置表和別名,例如:

odule_author(author);

module_description(description);

module_version(version_string);

module_device_table(table_info);

module_alisa(alternate_name);

Linux驅動 模組通訊

編寫模組通訊例項 模組add sub提供add integer 加法與sub integer 減法函式,模組test呼叫函式完成操作。分別對兩模組建立兩個資料夾,編寫對應的.c與makefile檔案,add sub.h在add sub模組資料夾內,分別make編譯成功。遇到的問題 1.insmod ...

Linux裝置驅動 模組

模組檔案 在檔案系統中可以被直接插入到核心的檔案 模組三要素 模組載入函式 必須 當在檔案系統中使用insmod或者該模組在核心被執行的時候,自動執行該函式 函式方式 1 預設方式 int init module void 2 使用者自定義 int test init void module ini...

編譯Linux驅動模組

xz d linux 5.7.8.tar.xz tar xf linux 5.7.8.tar cd linux 5.7.8 make menuconfig 執行make menuconfig 報錯 error 1 unable to find the ncurses package.install ...