linux系統核心執行於乙個單獨的保護區中,但是執行核心在執行時動態的新增或者刪除**,這些**包括了相關的資料 函式入口 出口並被組合在乙個單一的二進位制映象中,即可裝載核心模組,簡稱為模組。
乙個最簡單的模組組建過程如下:
//hello world 模組原始碼
#include
#include
#include
static int __init hello_init()
static void __exit hello_exit()
module_init(hello_init);
module_exit(hello_exit);
module_license("gpl");
module_author("echoes_of_rainbow");
對於模組,入口函式通過module_init來進行註冊。模組被解除安裝時執行的清理操作的函式通過module_exit來註冊,module_license用以指定版權,module_author用以指定作者資訊。
模組的編譯需要通過makefile來進行,乙個簡單的版本如下:
obj-m += hello.o 指定編譯的模組名
cur_path := $(shell pwd)
kernel_path := /usr/src/linux-headers-2.6.31-14-generic 需要指定當前系統執行的原始碼路徑
all:
make -c $(kernel_path) m=$(cur_path) modules
核心模組需要載入到系統中才可以執行。在root下,insmod用來載入,rmmod用來解除安裝模組。模組被解除安裝時會呼叫module_exit註冊的函式,但是如果模組被靜態編譯到系統核心匯中,那麼解除安裝函式不是必需的,因為不會被呼叫。
注意,如果編譯時指定的核心原始碼的版本與正在執行的系統的版本不一致,可能會導致模組載入失敗。
上述原始碼中使用了核心函式printk,其輸出可以通過/va/log或者dmesg檢視。<1> 用以指定輸出資訊的級別。
__init巨集在模組靜態編譯到系統核心時,使得指定的函式執行完後就會被釋放。__exit巨集則在模組靜態編譯到系統核心時,使得指定的函式會被忽略。
Linux 2 6核心驅動之hello模組
終於開始在鍾愛的linux上學習寫驅動程式了。本來以為寫乙個hello模組是異常簡單的事情,結果折騰了幾天才編譯通過。首先為了測試安裝了虛擬機器 核心程式是很危險滴,我可不想讓自己的愛本頻繁崩潰 裝fedora17 fedora18的live版在虛擬機器上始終跑不起來 來回來去幾次也裝不上virtu...
linux 載入hello模組
1 hello 1.c hello 1.c the st kernel module.include needed by all modules include needed for kern alert int init module void void cleanup module void 2...
Linux之核心模組
linux核心採用的是模組化技術,這樣保證了核心的可維護性和可擴充套件性。模組化設計允許我們在需要時才將某個模組載入到核心,實現動態核心的調整。linux核心模組的命名方式通常為 模組名稱.ko 在centos 7中核心模組被集中儲存在 lib modules目錄下。對核心模組的基本操作 1 檢視核...