Linux核心模組簡介

2021-10-25 09:42:13 字數 3570 閱讀 6161

要想使編寫的驅動程式生效,就需要把寫好的**編入到核心中。那怎麼把自己寫的**放入核心進行編譯呢?總共有兩種方法:

1)把所有需要的功能編入核心即可實現。但是這麼做會產生兩個問題:

第乙個問題是如果所編寫的**中有錯誤,需要除錯,那麼每一次都需要重新編譯整個核心,這會非常消耗時間。這麼說有的小

夥伴就會問了,這又能消耗多長時間呢?以筆者親身經歷的乙個嵌入式專案來看,重編依次核心大約2小時左右。假設你除錯代

碼需要3次才能除錯通過(實際工程中三次除錯好乙個功能都屬於大神級別的人物了,除非你調的功能非常簡單),那光是編譯

核心就需要6個小時,再加上包括版本公升級之類的操作再占去2個小時,那就是相當於一天的工作投入,如果你那功能需要除錯7-

8次,那可能兩三天的工作量就投進去然後還未必能把活幹明白。所以說實際工程中要是敢這麼幹,別的不說,你的領導肯定要

找你談話了。。。

第二個問題是,如果隨便什麼功能都往核心中編譯,那麼這個核心會越來越大,這也是我們不想看到的。

2)第二種方法,也是實際開發中最長使用的一種方法。它依賴linux提供的一種叫做「模組」的機制,模組有幾個特點,第乙個

特點是:模組本身不被編譯進核心,從而控制了核心的大小。第二個特點是:當需要乙個模組時,可以動態載入,模組一旦被

載入,他就和核心中的其他部分完全一樣了。

接下來寫乙個最基礎樣例看一看:

helloko.c

#include

#include

static __init int

hello_init

(void

)static

void __exit hello_exit

(void

)module_init

(hello_init)

;module_exit

(hello_exit)

;module_license

("dual bsd/gpl");

在這裡插入**片

makefile

kvers =

$(shell uname -r)

#kernel modules

obj-m += helloko.o

curdir=

$(shell pwd)

all:

make -c /lib/modules/$(kvers)

/build m=

$(curdir)

modules

clean:

make -c /lib/modules/$(kvers)

/build m=

$(curdir)

clean

先解釋下helloko.c檔案,hello_init是核心模組載入函式,一般用__init宣告,通過module_init呼叫;

hello_exit是核心模組解除安裝函式,一般用__exit宣告,通過module_exit呼叫。

module_license(「gpl」)是模組許可宣告,是固定內容且是必寫的。

以上三塊內容構成最基本的核心模組,這三塊都是必寫的。

printk函式是核心空間的輸出函式,由於核心空間不是使用者空間,不能使用printf,故只能使用printk。

printk有7個輸出資料等級,我這裡使用的kern_emerg是第0級,也是優先順序最高的輸出級別,代

表「緊急事件訊息,系統崩潰之前提示,表示系統不可用」,小夥伴們可以根據實際需要選用合適的輸

出級別。

再來看看makefile檔案

事先宣告一下,和.c一樣,我寫的makefile也是最簡形式,實際工程中makefile的編寫要複雜的多。

make -c /lib/modules/(kv

ers)

/bui

ld指明

跳轉到源

碼目錄下

讀取那裡

的mak

efil

e。m=

(kvers)/build指明跳轉到原始碼目錄下讀取那裡的makefile。 m=

(kvers

)/bu

ild指

明跳轉到

原始碼目錄

下讀取那

裡的ma

kefi

le。m

=(curdir)表明執行完原始碼的makefile後返回到當前目錄繼續讀入。

至於$(shell ***)代表了在makefile中執行shell命令。

當前目錄下檔案結構是這樣的:

再介紹幾個命令:

lsmod命令:獲取系統中載入了的所有模組以及模組間的依賴關係,例如

insmod命令:載入模組命令。

rmmod命令:解除安裝模組命令。

下面開始編譯.ko檔案

1、執行make命令,得到以下檔案,其中helloko.ko檔案就是我們需要載入的.ko檔案。

2、執行insmod命令,注意.ko檔案的出現方式,另外由於我的虛擬機器沒有使用root使用者,所以需要輸入sudo

如果使用root使用者的話,就不必sudo了。

3、執行lsmod看看helloko.ko是否已經載入成功,從來看果真載入成功了。

4、既然模組載入成功了,那麼有些小夥伴就會你問了,列印呢?怎麼螢幕沒有輸出列印資訊呢?其實核心列印資訊

和使用者空間列印資訊不同,它可以不輸出到螢幕上,要看核心列印資訊,還需要執行dmesg命令。紅框中就是我新增的列印。

5、執行rmmod命令,注意和insmod命令的helloko.ko引數形式做對比

6、執行lsmod看看是否解除安裝乾淨,看圖可知,沒有helloko模組,可知模組已經解除安裝乾淨了。

7、再次執行dmesg,看是否有模組解除安裝的列印資訊。由圖可知,是有列印資訊的。

以上就是載入與解除安裝乙個最基礎模組的步驟,如有錯誤,歡迎批評指正。

Linux 核心模組簡介

linux提供了這樣一種機制,這種機制被稱為模組。模組具有這樣的特點 模組本身不被編譯入核心映像,從而控制了核心的大小。模組一旦被載入,它就和核心中的其它部分完全一樣。一 模組的組成 乙個linux核心模組主要由如下幾個部分組成 1 模組載入函式 linux 核心模組載入函式一般以 init標識宣告...

Linux核心簡介

說明 只供學習交流 一,linux體系結構 如果有人問你,linux系統是如何構成的?只要把下面這幅圖說給他聽,就ok 從圖上我們可以知道,linux系統是由使用者空間和核心空間兩部分組成,之所以將linux系統劃分為使用者空間和核心空間很大一部分原因是為了安全著想。linux簡化了分段機制,使得虛...

Linux 核心 簡介

核心是linux系統的最底層,提供了系統的核心功能並允許程序以一種有序的方式訪問硬體 用於控制程序,輸入,輸出裝置,檔案系統操作,管理記憶體,這些都是系統自動完成的,你大可安然睡覺去,linux核心支援多使用者,多工模式執行 多使用者 同時有多個使用者訪問系統 多工 某個時刻有多個任務執行 linu...