linux驅動開發核心模組編譯之Makefile入門教程,驅動開發makefile

來源:互聯網
上載者:User

linux驅動開發核心模組編譯之Makefile入門教程,驅動開發makefile

一、模組的編譯

我們在前面核心編譯中驅動移植那塊,講到驅動編譯分為靜態編譯動態編譯;靜態編譯即為將驅動直接編譯進核心,動態編譯即為將驅動編譯成模組。

而動態編譯又分為兩種:

a -- 內部編譯

在核心源碼目錄內編譯

b -- 外部編譯

在核心源碼的目錄外編譯

二、具體編譯過程分析

註:本次編譯是外部編譯,使用的核心源碼是Ubuntu 的原始碼,而非開發板所用linux 3.14核心源碼,運行平台為X86。

對於一個普通的linux裝置驅動模組,以下是一個經典的makefile代碼,使用下面這個makefile可以完成大部分驅動的編譯,使用時只需要修改一下要編譯產生的驅動名稱即可。只需修改obj-m的值。

ifneq($(KERNELRELEASE),)

obj-m:=hello.o

else

KDIR:=/lib/modules/$(shelluname-r)/build

PWD:=$(shellpwd)

all:

make-C$(KDIR)M=$(PWD)modules

clean:

rm-f*.ko*.o*.symvers*.cmd*.cmd.o

endif

1、makefile 中的變數

先說明以下makefile中一些變數意義:

(1)KERNELRELEASE 在linux核心原始碼中的頂層makefile中有定義

(2)shell pwd 取得當前工作路徑

(3)shell uname -r 取得當前核心的版本號碼

(4)KDIR 當前核心的原始碼目錄。

關於linux源碼的目錄有兩個,分別為

"/lib/modules/$(shell uname -r)/build"

"/usr/src/linux-header-$(shell uname -r)/"

但如果編譯過核心就會知道,usr目錄下那個原始碼一般是我們自己下載後解壓的,而lib目錄下的則是在編譯時間自動copy過去的,兩者的檔案結構完全一樣,因此有時也將核心源碼目錄設定成/usr/src/linux-header-$(shell uname -r)/。關於核心源碼目錄可以根據自己的存放位置進行修改。

(5)make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules

這就是編譯模組了:

a -- 首先改變目錄到-C選項指定的位置(即核心原始碼目錄),其中儲存有核心的頂層makefile;

b -- M=選項讓該makefile在構造modules目標之前返回到模組原始碼目錄;然後,modueles目標指向obj-m變數中設定的模組;在上面的例子中,我們將該變數設定成了hello.o。

2、make 的的執行步驟

a -- 第一次進來的時候,宏“KERNELRELEASE”未定義,因此進入 else;

b -- 記錄核心路徑,記錄當前路徑;

由於make 後面沒有目標,所以make會在Makefile中的第一個不是以.開頭的目標作為預設的目標執行。預設執行all這個規則

c -- make -C $(KDIR) M=$(PWD) modules

-C 進入到核心的目錄執行Makefile ,在執行的時候KERNELRELEASE就會被賦值,M=$(PWD)表示返回目前的目錄,再次執行makefile,modules 編譯成模組的意思

所以這裡實際啟動並執行是

make -C /lib/modules/2.6.13-study/build M=/home/fs/code/1/module/hello/ modules

d -- 再次執行該makefile,KERNELRELEASE就有值了,就會執行obj-m:=hello.o

obj-m:表示把hello.o 和其他的目標檔案連結成hello.ko模組檔案,編譯的時候還要先把hello.c編譯成hello.o檔案

可以看出make在這裡一共調用了3次

1)-- make

2)-- linux核心源碼樹的頂層makedile調用,產生。o檔案

3)-- linux核心源碼樹makefile調用,把.o檔案連結成ko檔案

3、編譯多檔案

若有多個源檔案,則採用如下方法:

obj-m := hello.o

hello-objs := file1.o file2.o file3.o

三、內部編譯簡單說明

如果把hello模組移動到核心原始碼中。例如放到/usr/src/linux/driver/中, KERNELRELEASE就有定義了。

在/usr/src/linux/Makefile中有KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)。

這時候,hello模組也不再是單獨用make編譯,而是在核心中用make modules進行編譯,此時驅動模組便和核心編譯在一起。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.