寫乙個核心模組的makefile模板記錄:
ifneq ($(kernelrelease),)
obj-m:=abc.o
else
kdir:=/lib/modules/$(shell uname -r)/build
pwd=$(shell pwd)
all:
make -c $(kdir) m=$(pwd) modules
clean:
-rm *.o* *.s* *.m*
endif
那麼你編譯的模組怎麼就能在核心中執行呢?
原理是這樣的:
1.執行make,因為kernelrelease沒有定義,會跳轉到 $(kdir)也就是核心原始碼目錄。(make -c $(kdir) 就是跳轉到 $(kdir) )
2.執行主目錄makefile設定相關變數,其中就有kernelrelease,當然還有其他和核心相關的設定,然後編譯乙個指定的模組。而這個模組的路徑是通過m=$(pwd)指定,也就是當前目錄。
3.然後跳到這這個模組的目錄執行他的makefile,(又一次執行此makefile)此時kernelrelease已經定義,那就是執行:obj-m:=abc.o。這和核心**裡的模組makefile是一樣的。指定了以模組形式編譯。
4.最後編譯這個模組adc.ko
另外,如果模組有好幾個c檔案,那麼
需要將obj-m = abc.o換成如下**:
obj-m = mn.o
mn-objs = m.o, n.o
核心模組Makefile
前些天寫乙個驅動模組。竟然寫核心模組makefile時出了問題,於是將其總結下來,下次再用時拿過來改下就行了。general purpose makefile for linux kernel module by guoqingbo kern dir home gqb development lin...
核心模組Makefile
ifneq kernelrelease obj m hello.o else kdir lib modules shell uname r build pwd shell pwd all make c kdir m pwd modules clean make c kdir m pwd clean ...
核心模組載入錯誤 Makefile
載入核心模組錯誤 insmod error inserting globalvar.ko 1 device or resource busy 問題描述 裝置號跟已有的裝置衝突了 解決方法 檢視已有裝置號 cat proc devices 修正在程式中設定的裝置號,或者改為自動分配 錯誤2 insmo...