Linux核心模組初探 HelloWorld

2021-08-20 19:06:43 字數 2244 閱讀 3536

本文通過學習宋寶華老師的《linux裝置驅動開發詳解》第四章而寫的學習筆記,感謝這本好書

因為linux核心架構龐大,元件很多,如果我們把所有需要功能都編譯到linux核心中,就會導致核心很大,並且當我們要在現有核心中新增或刪除功能時都要重新編譯核心。

linux使用了模組(module)這一種機制,模組不用編譯進核心映像,模組可以被載入和解除安裝,如果被載入就和核心中其他部分一樣。

模組載入函式

當通過insmod或modprobe命令載入核心模組時,模組的載入函式會自動被核心執行,完成本模組的相關初始化工作

模組解除安裝函式

當通過rmmod命令解除安裝某模組時,模組的解除安裝函式會自動被核心執行,完成與模組解除安裝函式相反的功能

模組許可證明

許可證(license)宣告描述核心模組的許可許可權,如果不宣告license,模組被載入時,將會收到核心被汙染(kernel tainted)的警告

核心模組領域,可接受的license包括「gpl」、」gpl v2」、」gpl and additional rights」、」dual bsd/gpl」、」dual mpl/gpl」

模組引數(可選)

模組引數是模組被載入時候可以傳遞給它的值,它本身對應模組內部的全域性變數

模組匯出符號(可選)

核心模組可以匯出的符號(symbol,對應於函式或變數),若匯出,其他模組則可以使用本模組中的變數或函式

模組作者等資訊宣告(可選)

hello.c:

#include 

#include

static

int __init hello_init(void)

module_init(hello_init);

static

void __exit hello_exit(void)

module_exit(hello_exit);

module_license("gpl v2");

#define  __init  __attribute__ ((__section__ (".init.text"))) __cold
__init的函式如果直接編譯進核心,成為核心映象的一部分,在連線的時候都會放在.init.text這個區段內

- 模組載入函式以 「module_init(函式名)」的形式被指定。初始化成功則返回0;失敗則返回錯誤編碼

- 解除安裝函式一般以 __exit標識宣告

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

使用命令insmod載入hello.ko

sudo insmod ./hello.ko
載入完後使用命令lsmod可以看到hello模組已經被載入到系統中:

使用命令rmmod命令解除安裝hello模組,解除安裝完後再用lsmod命令檢視hello模組已經不在:

我們在載入和解除安裝時候,在控制台並沒有看到 「hello world」的輸出,這是因為我們使用的printk給的引數(kern_info),使得日誌級別沒有控制台要求輸出的最低級別高

使用下述語句檢視日誌:

cat /var/log/syslog | grep hello
就可以看到我們載入和解除安裝hello模組的輸出資訊了:

Linux核心初探

虛擬記憶體有很多用途和優點 虛擬記憶體子系統的主要成分是虛擬位址空間 virtual address space 的概念 隨機訪問儲存器 ram 即記憶體的使用 當可用記憶體達到臨界時,可以呼叫頁框 page frame reclaiming 演算法釋放其他記憶體 虛擬記憶體必須要解決的乙個問題是記...

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

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

初探Linux 核心編譯

此次操作環境為virtualbox中的centos6.5,編譯的核心核心版本為linux 2.6.32.63 可以在終端輸入指令檢視自己的核心版本,如果系統不是centos6.5的可以根據自己的核心下乙個更高版本的核心原始碼進行編譯安裝。uname rs在終端執行 wget2 準備編譯 拷貝核心 到...