核心模組編譯--Makefile寫法
核心模組編譯-Makefile寫法
如果編譯核心模組,可以編寫Makefile,然後執行make命令即可。
Linux2.6的Makefile模板如下:
#Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationship of files and target modules are listed here.
mymodule-objs := file1.o file2.o
obj-m := mymodule.o
else
PWD := $(shell pwd)
KVER := &(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf *.*.cmd *.o *.mod.c *.ko .tmp_versions
endif
注意:
1.ifneq 後面有空格。
2.命令前面必須使用tab鍵,如&(MAKE)和rm 的前面。
3.Makefile必須和相應的.c檔案放在同一個目錄下。
程式碼解釋:
(1) ifneq ($(KERNELRELEASE),)
KERNELRELEASE是在核心原始碼的頂層Makefile中定義的一個變數,當第一次執行這個Makefile時,KERNELRELEASE沒有被定義,所以會執行else後面的內容。
(2)PWD:=$(shellpwd)
可以把shell指令碼寫到Makefile裡面,這句話的意思:執行shell指令碼命令pwd(pwd是顯示當前目錄的路徑),把返回值賦給PWD這個變數,所以PWD存的就是當前目錄的路徑。
(3)KVER:=$(shell uname -r)
執行shell指令碼命令:uname-r,這個命令的作用是顯示當前核心版本(kernelreleaes),所以變數KVER的內容是當前系統kernelrelease.
(4)KDIR:=/lib/modules/$(KVER)/build,DIR指定了核心原始碼的路徑.
(5)all:
$(MAKE) -C $(KDIR) M=$(PWD) #前面必須是tab。
這裡all只是個標號,可以自己定義,是make的預設執行目標。
。這裡實際上就是指向make程式,所以這裡也可以把$(MAKE)換成make.
-C:是make命令的一個選項,-C作用是changedirectory. -C dir 就是轉到dir目錄。
M=$(PWD):返回當前目錄。
這句話的意思是:當make執行預設的目標all時,-C(PWD)表示又返回到當前目錄來執行當前的Makefile.
(6)當從核心原始碼目錄返回時,再次執行這個Makefile時,KERNELRELEASE已經被定義過,這次 ifneq ($(KERNELRELEASE),)條件判斷成立,就會執行後面的內容。ifneq之後else之前的內容為kbuild語法的語句,指明模組原始碼中各模組間的依賴關係,以及要生成的模組的名稱。
(7)mymodule_objs:=file1.ofile2.o
表明mymodule.o由file1.和file2.o連結生成
(8)obj-m:=mymodule.o
編譯連結後要生成mymodule.o模組。obj-m表示以模組編譯,obj-y表示編譯並連結進核心.
注:如果模組就由一個檔案編譯而成,可寫為:obj-m:=mymodule.o。(必須與mymodule.c名字對應,都是mymodule。上面的file1.ofile2.o也如此)
(9)clean:
rm -rf *.*.cmd *.o *.mod.c *.ko .tmp_versions
在命令列中輸入:make,只會執行(1)到(8)的指令,不會執行clean標號之後的指令。要想執行clean標號後面的指令,需要在命令列中輸入:makeclean
rm 就是刪除後面這些由make生成的檔案。一般如果需要重新執行make編譯之前,使用make clean先清理上次生成的檔案。
如果想刪除make生成的所有檔案,也可以使用下面方式:
clean:
$(MAKE) -C $(KDIR) M=$(PWD)clean
或者
clean:
make-C $(KDIR) M=$(PWD)clean
一個簡單的Makefile例子(為《核心模組程式機構》中hello.c編寫的)
//Makfile
ifneq ($(KERNELRELEASE),)
#kbuildsyntax. dependency relationshsip of files and target modules arelisted here.
#mymodule-objs:= file1.o file2.o
obj-m:= hello.o
else
PWD := $(shell pwd)
KVER:= $(shell uname -r)
KDIR:= /lib/modules/$(KVER)/build
all:
$(MAKE)-C $(KDIR) M=$(PWD)
clean:
$(MAKE)-C $(KDIR) M=$(PWD) clean