第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

最重要到問題,我要完全看懂需要什么知識點。為什么和我以前寫到makefile不一樣?

最重要到問題,我要完全看懂需要什么知識點。為什么和我以前寫到makefile不一樣?

蕪湖不蕪 2022-10-02 13:09:57
obj-m := helloworld.oKERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD = $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:$(RM) *.o *.ko *.mod.c Module.symvers Module.markers Module.symvers module.order問題1.obj-m := helloworld.o 有什么用問題2:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules 這個沒看懂特別是為什么有個=號,還有個modules?問題3:$(RM) *.o *.ko *.mod.c Module.symvers Module.markers Module.symvers module.order 后面那么多東西干什么到?。?!
查看完整描述

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)核里跑起來了。

查看完整回答
反對 回復 2022-10-06
?
慕哥6287543

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 為偽目標


查看完整回答
反對 回復 2022-10-06
?
慕姐8265434

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 這個下面的命令行 刪除過程程序。


查看完整回答
反對 回復 2022-10-06
  • 3 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號