linux驅動模組Makefile解

2021-07-17 04:04:11 字數 1889 閱讀 7138

以下是乙個經典的編譯乙個linux裝置驅動的makefile**,此makefile可以完成對大部分驅動的編譯,使用時只需要稍加修改就可以了。

$(warning kernelrelease=$(kernelrelease))

ifeq ($(kernelrelease),)

#kerneldir ?= /home/linux/linux3.14/

kerneldir ?= /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

mymod := hello

modules:

$(make) -c $(kerneldir) m=$(pwd) modules

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions module* modules*

.phony: modules modules_install clean

else

obj-m := $(mymod).o

endif

在模組的源**目錄下執行make,此時,巨集「kernelrelease」是沒有定義的,所以會執行ifeq下面的內容,分別將以下變數進行賦值:

kerneldir: 這個變數是用來存放核心原始碼的路徑的,在makefile中我們可以看到有兩個kerneldir,乙個是用來儲存標準的核心原始碼(linux-3.14)所在的路徑的,乙個是用來儲存當前正在執行的ubuntu系統自己的核心原始碼路徑。如果你的驅動要在開發板上執行,那麼你的makefile中kerneldir就要選擇標準的核心原始碼路徑(linux-3.14), 如果你的驅動只想在你的ubuntu上測試,那麼選用當前正在執行的ubuntu系統自己的核心原始碼路徑就可以了。

pwd: 這個變數是用來儲存你當前的驅動原始碼所在的路徑的。

mymod: 這個變數是用來儲存你的模組的名字的,在編譯時會尋找$(mymod).c進行編譯,最終也會生成乙個$(mymod).ko,所以要編譯你自己的模組你需要修改這個mymod。

由於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行:     

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等檔案時命令會出錯。它是防止這出錯的方式。

Linux驅動模組基礎

1 模組載入函式 linux核心模組載入函式一般以 init標識宣告,典型的模組載入函式的形式如下 static int init initialization function void module init initialization function 模組載入函式必須以 module in...

Linux驅動 模組通訊

編寫模組通訊例項 模組add sub提供add integer 加法與sub integer 減法函式,模組test呼叫函式完成操作。分別對兩模組建立兩個資料夾,編寫對應的.c與makefile檔案,add sub.h在add sub模組資料夾內,分別make編譯成功。遇到的問題 1.insmod ...

Linux裝置驅動 模組

模組檔案 在檔案系統中可以被直接插入到核心的檔案 模組三要素 模組載入函式 必須 當在檔案系統中使用insmod或者該模組在核心被執行的時候,自動執行該函式 函式方式 1 預設方式 int init module void 2 使用者自定義 int test init void module ini...