開始寫乙個核心模組

2021-09-22 16:42:16 字數 1381 閱讀 4424

從hello world開始,乙個完整的核心模組helloword.c如下:

#include//module_init 和 module_exit 的標頭檔案

#include//這個標頭檔案包含了許多符號與函式的定義,這些符號與函式多與載入模組有關

module_license("dual bsd/gpl"); //和開源軟體帶的license檔案差不多,是個使用許可證,在module.h裡有可定義的license。

static int hello_init(void) //盡量使用static,防止重名產生的編譯錯誤

static int hello_exit(void)

module_init(hello_init);//載入到核心時呼叫

module_exit(hello_exit);//去除核心時呼叫

編譯該檔案之後會生成核心模,.ko檔案,這個就是載入核心時的**段,hello.ko。

依據你的系統用來遞交訊息行的機制, 你的輸出可能不同. 特別地, 前面的螢幕輸出是來自乙個字元控制台; 如果你從乙個終端模擬器或者在視窗系統中執行 insmod 和 rmmod, 你不會在你的螢幕上看到任何東西. 訊息進入了其中乙個系統日誌檔案中, 例如 /var/log/messages

使用insmod hello.ko可以載入該模組到核心,rmmod解除安裝該模組,解除安裝時會執行module_exit,相當於告訴核心我下班了,表給我打**。

核心模組執行在核心空間,而不是應用程式一樣執行在使用者空間,意味著核心模組有著更高的特權級別,也意味著他們有著各自的位址空間。應用程式存在虛擬記憶體中,有乙個很大的堆疊區。核心的堆疊很小,可能只有乙個4096位元組的頁,而且還要與這個核心空間呼叫鏈共享這個堆疊。

模組的角色是擴充套件核心功能,模組化的**在核心空間執行,驅動會進行兩種任務,模組的裡的一部分來作為系統呼叫,一部分用來負責中斷處理。當乙個應用沖虛發出乙個系統呼叫或者硬體中斷掛起時,執行系統呼叫的核心**對程序來說是非同步的,不和任何特別的程序有關。

核心程式設計要注意併發問題,因為在同乙個時間不止乙個程式能夠呼叫同乙個驅動,大部分裝置能夠終端處理器;中斷處理非同步執行,並且可能在你的驅動試圖做其他事情的同一時間被呼叫,也可能字多個cpu上併發執行。所以核心**,包括驅動**,必須是可以重入的。這裡必須要注意的是,核心模組在退出之前必須小心的釋放所有的資源,否則會一直執行直到系統重啟。

當你檢視核心 api 時, 你會遇到以雙下劃線(__)開始的函式名. 這樣標誌的函式名通常是乙個低層的介面元件, 應當小心使用. 本質上講, 雙下劃線告訴程式設計師:" 如果你呼叫這個函式, 確信你知道你在做什麼."

核心**不支援浮點運算。

編譯乙個核心模組

1,編寫hello.c include include module license gpl static int init hello init void static void exit hello exit void module init hello init module exit hel...

Linux下開始乙個簡單核心模組 hello

目的 建立乙個簡單的核心模組,並把它掛載到核心中去。這個核心模組沒有與外界有任何的資料互動。定義 kernel 表示此原始檔可以看到核心原始檔的所有內容 因為有的核心的標頭檔案會被使用者空間的應用程式包含,但是內 核中的內容有些是核心專用的,需要對使用者隱藏起來 ifndef kernel defi...

Linux 寫乙個簡單的模組

1.建立乙個目錄 mkdir zhu cd zhu vim hello.c 編寫乙個名為hello的檔案 2.hello.c include 所有模組都需要的標頭檔案 include static int hello init void static void hello exit module i...