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