模組(載入函式和解除安裝函式)

2021-07-09 12:20:56 字數 1124 閱讀 9308



linux模組是一些**的整合,可以在啟動系統後動態鏈結到核心的一部分,一旦載入之後就和核心沒有什麼區別,可以使核心崩潰。當不需要這些模組時,又可以斷開鏈結將其刪除。linux的模組可以用c語言來編寫,用gcc來編譯生成目標檔案(不進行鏈結,作為*.o檔案存在),為此需要在gcc命令裡加入-c的引數。由於不進行鏈結,gcc只允許乙個輸入文字,因此乙個模組的所有部分都必須在乙個檔案中實現。

當編寫模組時,必須提供兩個函式,乙個是int init_moudule(void),供insmod在載入此模組的時候自動呼叫,負責模組的初始化工作。函式返回0,則初始化成功,返回負數,則失敗。另乙個函式是void cleanup_module(void),在模組在被解除安裝時呼叫,負責進行裝置驅動程式的清除工作。

#define module

#include

int init_module(void)

void cleanup_module(void)

#define module首先明確這是乙個模組,任何乙個模組程式的編寫都要包含乙個linux/module.h這個標頭檔案,這個檔案包含了對模組的結構定義以及對模組版本的控制。

printk函式的功能與printf相似,只能由核心例程呼叫,使用者態程式則需要呼叫printf來完成列印

#gcc –c hello.c –dmodule –d_kernel_-dlinux –wall –o2 –i/usr/src/linux-2.4/include

這裡編譯用了乙個-i開關,意思是編譯時利用/usr/src/linux-2.4/include中的標頭檔案,而不是/usr/include中的標頭檔案,這兩個目錄下的標頭檔案是不一樣的,前者用於開發核心模組,後者擁有開發應用程式。如果兩個檔案內容是一樣的,則可以不用-i這個開關。

後來linux提供了兩個巨集module_init()和module_exit()來顯式地命名模組的載入函式和解除安裝函式,通常在原始檔的末尾加上這兩個函式。則程式可以改為:

#define module

#include

int hello_init(void)

void hello_exit(void)

module_init(hello_init);

module_exit(hello_exit);

模組的編寫 編譯 載入和解除安裝

以最簡單的hello world模組為例 1.編寫模組 my module.c include include include static int hello init void static void hello exit void module init hello init module e...

linux驅動模組的載入和解除安裝

linux 驅動有兩種執行方式,第一種就是將驅動編譯進 linux 核心中,這樣當 linux 核心啟動的時候就會自動執行驅動程式。第二種就是將驅動編譯成模組 linux 下模組擴充套件名為.ko 在linux 核心啟動以後使用 insmod 命令載入驅動模組。在除錯驅動的時候一般都選擇將其編譯為模...

核心模組的載入與解除安裝

1 核心原始碼存放的位置 usr src linux 或者 usr src kernel 2 核心模組存放的位置 lib modules uname r kernel 3 模組的依賴性 檢查 lib modules uname r modules.dep檔案,它記錄了核心支援模組的依賴關係。dep檔...