3 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
首先說一下,你要編譯驅(qū)動程序,不再是跟原本編譯應用程序那樣可以在當前目錄下直接make就好。
因為編譯內(nèi)核驅(qū)動的時候,是要用到內(nèi)核文件里的頭文件,還有內(nèi)核提供的接口函數(shù),要借助于內(nèi)核文件夾里的makefile來編譯你寫好的驅(qū)動源代碼,如果按一般的操作,你就得把源代碼放到內(nèi)核文件夾指定的目錄下,然后再在那個目錄下得makefile里添加一些語句,比如obj -m什么的(把相應的驅(qū)動代碼編譯成模塊),然后到內(nèi)核文件夾的頂層目錄make,生成相應的模塊文件,就有你問題3的那一大堆東西,其中.ko就是要用到的。
把一些驅(qū)動編譯成模塊,和編譯進內(nèi)核的區(qū)別,你可以去了解下。。編譯成模塊用的是-m。
而為了方便你可以在任何目錄下直接用make來編譯驅(qū)動代碼;就有以下這指令:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
-C 指定的就是內(nèi)核文件夾所在的地方
M=當前路徑
modules的,是和make 聯(lián)合起來的..make modules命令,這個命令你可以去查查。
.ko文件就是用insmod命令插入到內(nèi)核中,在去添加相應的設備文件,就可以在內(nèi)核里跑起來了。

TA貢獻1831條經(jīng)驗 獲得超10個贊
這個你得看一下makefile是如何寫的, makefile與shell很像,
obj-m是固定格式的,-m表示的是內(nèi)核模塊,helloworld.o是生成目標文件
2.4內(nèi)核為.o 2.6為.ko
$(MAKE) $(RM) 是環(huán)境變量 分別代碼 make 和 rm -rf
-C 切換目錄到 $(KERNELDIR) ,其中$(KERNELDIR) 是一個變量,,也就是:KERNELDIR ?= /lib/modules/$(shell uname -r)/build
M=$(PWD) 其中 M是一個宏
$(PWD)是一變量,該變量的值為 $(shell pwd)
$(shell pwd) 是makefile中的函數(shù)
調(diào)用makefile中函數(shù)與使用$()
shell為函數(shù)名
pwd 為函數(shù)的參數(shù)
這個shell函數(shù)的作用就是執(zhí)行shell命令 所以它的參數(shù)也必然是一個命令 pwd就是一個命令
modules是目標 具體modules是什么 ,要體該目錄下的 makefile 是如何來定義這個目標的
clean :是一個偽目標 ,沒有依賴,但它有執(zhí)行的命令 :$(RM) *.o *.ko *.mod.c Module.symvers Module.markers Module.symvers module.order
就是刪除編譯時產(chǎn)生的文件
clean這個偽不會自動執(zhí)行,自動執(zhí)行的必須第一個目錄,也就是默認目標 default
所以當進行編譯時,只需要輸入make 就可以編譯了,它默認執(zhí)行是第一個目標
也就是default偽目標
但clean 偽目標是不會執(zhí)行的,,
make命令的格式
make [選項參數(shù)] [宏] [目標]
需要手動執(zhí)行 輸入make clean 其中clean 為偽目標

TA貢獻1813條經(jīng)驗 獲得超2個贊
obj-m := helloworld.o //生成目標文件 helloworld.o 當然中間還有其他產(chǎn)物,但是2.4內(nèi)核是安裝.o 文件的,后來2.6就 變成.ko文件,但是還保留著 .o 的格式
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
MAKE 可以理解為調(diào)用MAKE 函數(shù) 你用make函數(shù)肯定要有編譯好的內(nèi)核鏡像撒,就用 (KERNELDIR) 就是內(nèi)核鏡像的目錄, pwd就是當前目錄 學過shell命令吧,就是編譯你當前的 ,一般這些都是格式 ,照著格式來 知道 它的目的就好了。modules 你編譯的是個模塊,所以要進去。
$(RM) 刪除 知道 rm就是刪除的shell命令 *.o就是代表只要是后綴為.o的文件 都會被刪除掉,因為編譯一個模塊會產(chǎn)生很多 過程 文件 ,如果不及時清除就會造成很大的空間浪費 ,至于后面幾個真不知道了
在命令行下輸入make
就是編譯 因為那個是default 學過switch case 吧
查找所有 ,當不存在時就會到default
當輸入make clean 時 就會找到clean 這個下面的命令行 刪除過程程序。
添加回答
舉報