linux内核驱动模块开发makefile实例解析
昨天整理了一篇關于linux內核驅動模塊的開發介紹入門,其中介紹了一些關于驅動模塊的基本開發步驟,不過面廣而不深,很多細節都沒有涉及到,其中就包括如何編寫驅動模塊的makefile。那么,今天我們就來聊一聊這個話題。
以下是摘自網絡上的一個經典的linux設備驅動的Makefile文件,以及詳細的內容解釋。此文件可以完成對大部分驅動的編譯,使用時只需要稍加修改就可以了。
$(warning KERNELRELEASE=$(KERNELRELEASE))ifeq ($(KERNELRELEASE),)KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) MYMOD := hellomodules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*.PHONY: modules modules_install cleanelseobj-m := $(MYMOD).o endif下面來依次介紹makefile文件中的各行語句的作用:
1、變量定義。首先,如果你在模塊的源代碼目錄下執行make,此時,宏KERNELRELEASE是沒有定義的,所以會執行ifeq下面的內容,分別將以下變量進行賦值:
- KERNELDIR:這個變量是用來存放內核源碼的路徑的,在Makefile中我們可以看到有兩個KERNELDIR,一個是用來保存標準的內核源碼所在的路徑的,一個是用來保存當前正在運行的ubuntu系統自己的內核源碼路徑。如果你的驅動要在開發板上運行,那么你的Makefile中KERNELDIR就要選擇標準的內核源碼路徑,如果你的驅動只想在你的ubuntu上測試,那么選用當前正在運行的ubuntu系統自己的內核源碼路徑就可以了。
- PWD:這個變量是用來保存你當前的驅動源碼所在的路徑的。
- MYMOD:這個變量是用來保存你的模塊的名字的,在編譯時會尋找$(MYMOD).c進行編譯,最終也會生成一個$(MYMOD).ko,所以要編譯你自己的模塊你需要修改這個MYMOD。
2、編譯規則。由于make后面沒有目標,所以make會在Makefile中的第一個不是以’.’開頭的目標作為默認的目標執行。于是“modules”成為make的目標。也就是執行下面的規則:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
這條規則展開之后就是:
make –C /home/linux/linux3.14/M=/home/linux/test/ modules
其中:
-C 表示到存放內核的目錄執行其makefile,在執行過程中會定義KERNELRELEASE,KERNELRELEASE在內核頂層Makefile中第396行:
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
2>代表錯誤重定向,當前面出現錯誤信息(cat 不到)時不會在終端上打印,而是重定向到一個空文件中(黑洞,看不到),如果沒有錯誤(cat 到信息-3.14.0)就賦值給KERNELRELEASE,并且不會重定向。
“M=”選項的作用是,當用戶需要以某個內核為基礎編譯一個外部模塊的話,需要在make modules 命令中加入“M=dir”,程序會自動到你所指定的dir目錄中查找模塊源碼,將其編譯,生成KO文件。
當執行完這條規則之后Makefile就會執行else分支,obj-m= hello.o,執行這條規則就會將hello.c編譯成hello.o,最終編譯成模塊hello.ko。
.PHONY 這是一個特殊目標名稱,.PHONY目標的具體意思是如果在Makefile的工作目錄中有名如:modules,modules_install,clean等文件時命令會出錯,它是防止這出錯的方式。
3、最后,再貼上我自己項目中改進后的makefile的源碼,以供參考:
KERNEL_DIR=$(TOP_DIR)/platform/kernel DRVNAME=mydrv_gpio PWD=$(shell pwd) obj-m+=$(DRVNAME).o $(DRVNAME)-objs := $(DRVNAME).obuild:@echo $(KERNEL_DIR)$(MAKE) -C $(KERNEL_DIR) M=$(PWD)install: buildcp $(DRVNAME).ko $(COM_INSTALL_YXAON_DIR)/user/yxkoclean:@rm -rf *.o *.ko .*.cmd *.mod.c *.order *.symvers .tmp_versions *~總結
以上是生活随笔為你收集整理的linux内核驱动模块开发makefile实例解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: potplayer真正的官网地址[通俗易
- 下一篇: 〖免杀〗.net程序一键免杀Win10