1 makefile編寫
ifneq ($(kernelrelease),)
obj-m := mytest.o
mytest-objs := file1.o file2.o file3.o
else
kdir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
default:
$(make) -c $(kdir) m=$(pwd) modules//到linux原始碼所在的目錄執行主makefile 並當前路徑傳給主makefile,告訴主makefile執行完後返回到當前目錄,執行makefile
endif
解釋為:
kernelrelease
是在核心原始碼的頂層makefile中定義的乙個變數,在第一次讀取執行此makefile時,kernelrelease沒有被定義,
所以make將讀取執行else之後的內容。如果make的目標是clean,直接執行clean操作,然後結束。當make的目標為all時,-c
$(kdir) 指明跳轉到核心原始碼目錄下讀取那裡的makefile;m=$(pwd)
表明然後返回到當前目錄繼續讀入、執行當前的makefile。當從核心原始碼目錄返回時,kernelrelease已被被定義,kbuild也被啟動去
解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句,
指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。mytest-objs := file1.o file2.o
file3.o表示mytest.o 由file1.o,file2.o與file3.o 連線生成。obj-m :=
mytest.o表示編譯連線後將生成mytest.o模組。
2 測試
原始檔
1//24 #include 5 #include 6 #include 7
8static
int hello_init(void
) 12
13static
void hello_exit(void
) 16
17module_init(hello_init);
18 module_exit(hello_exit);
makefile檔案
1ifneq ($(kernelrelease),)
2 obj-m:=hello.o
3else
4 kdir := /lib/modules/$(shell uname -r)/build56
all:
7 make -c $(kdir) m=$(pwd) modules
8clean:
9 make -c $(kdir) m=$(pwd) clean
10 endif
插入模組到核心
# insmod hello.ko
檢視輸出
[root@localhost demo]# dmesg | tail -n 5
[ 2445.017321] virbr0: port 2(vif1.0) entering forwarding state
[ 2445.017439] virbr0: port 2(vif1.0) entering disabled state
[ 2494.639683] hello: module license 'unspecified' taints kernel.
[ 2494.639688] disabling lock debugging due to kernel taint
[ 2494.639841] module init: hello world!
Linux核心模組編譯
data mining linux核心模組是一種可被動態載入和解除安裝的可執行程式。通過核心模組可以擴充套件核心功能,核心模組通常用於裝置驅動 檔案系統等。如果沒有核心模組,需要向核心新增功能就需要自發 重新編譯核心 安裝新核心等步驟。核心空間中不止乙個程式試圖訪問驅動程式模組,導致乙個核心塊在沒有...
Linux編譯核心模組
核心模組即驅動的編譯方式 1 本地編譯 2 交叉編譯 makefile主要寫法 本地編譯 obj m hello.o kdir lib modules shell uname r build pwd shell pwd all make c kdir m pwd modules clean rm o...
Linux 核心 編譯模組
由於除錯核心或者由於分割槽大小限制,有時候核心元件不一定完全需要編進核心中。所以,在開發中經常將核心元件編譯成為模組,等到在恰當的時機載入。linux核心模組的編譯方法有兩種 1.放入linux核心原始碼中編譯。2.獨立編譯模組。首先需要了解kconfig和makefile的作用 kconfig 對...