linux核心模組編譯

2021-09-08 09:24:18 字數 2008 閱讀 5771

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//2

4 #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檔案

1

ifneq ($(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 對...