国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

編譯linux內(nèi)核模塊時的make -C M= modules的參數(shù)說明

這篇具有很好參考價值的文章主要介紹了編譯linux內(nèi)核模塊時的make -C M= modules的參數(shù)說明。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????????在linux下編譯可加載內(nèi)核模塊形成.ko文件的makefile中的核心語句是:

$(MAKE) -C?$(KERNEL_DIR) M=(PWD) modules

這句是Makefile的規(guī)則:這里的

  • $(MAKE)就相當于make;
  • -C 選項的作用是指將當前工作目錄轉(zhuǎn)移到你所指定的位置,一般都是內(nèi)核源代碼目錄或者內(nèi)核headers目錄,如/usr/include/linux-5.1.1-headers/類似的位置;-C $(KERNEL_DIR) 代表切換工作目錄,因為內(nèi)核源碼頂層的Makefile文件定義了偽目標 modules,所以要先將工作目錄切換到內(nèi)核源碼頂層 Makefile 所在位置;
  • “M=”選項的作用是,當用戶需要以某個內(nèi)核為基礎(chǔ)編譯一個外部模塊的話,需要在make modules 命令中加入“M=dir”,程序會自動到你所指定的dir目錄中查找模塊源碼,將其編譯,生成KO文件。

注釋:這個是編譯linux核外模塊必備的makefile中的核心語句,相當于先跳轉(zhuǎn)到-C 指定的內(nèi)核目錄,然后執(zhí)行這個目錄下的makefile M=XXX modules(這個有點不好理解,一般都是在某個目錄下執(zhí)行makefile就行了,這里是執(zhí)行makefile M=XXX modules),相當于在當前系統(tǒng)內(nèi)核根目錄下執(zhí)行make M= XXX modules 進行XXX目錄下的模塊的編譯,編譯成xx.ko.這樣你的modules就可以在任何其他位置,而不用必須在內(nèi)核文件下面了。
例如:

obj-m := hello.o
KVERSION:= $(shell uname -r)

all:
	$(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
	$(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

---------------------------------------------------我是分割線------------------------------------------------------------

新的(一般指>2.6.18的內(nèi)核版本)內(nèi)核模塊編程中的make命令里有個M選項,如下:

make -C /lib/modules/$(shell uname -r )/build M = $(PWD) modules

M=$(PWD) 意思是返回到當前目錄繼續(xù)讀入、執(zhí)行當前的Makefile。
請參考:從 2.4 到 2.6:Linux 內(nèi)核可裝載模塊機制的改變對設(shè)備驅(qū)動的影響-CSDN博客

???????這個M是kbuild的東西呢,還是make本來自己就有的東西呢?
????????按理說,它是make的一個參數(shù),應(yīng)該是make的東西,但是make的doc里又找不到,如果是kbuild里的東西,它應(yīng)該怎樣來實現(xiàn)呢?經(jīng)查證這個M是內(nèi)核根目錄下的Makefile中使用的變量。M是makefile腳本中的一個變量(variable):

Use make M=dir to specify directory of external module to build.

Old syntax make … SUBDIRS=$PWD is still supported.

Setting the environment variable KBUILD_EXTMOD take precedence

ifdef SUBDIRS
    KBUILD_EXTMOD ?= $(SUBDIRS)
endif
ifdef M //如果沒有定義或賦值M,此處M未定義(undefined)

    ifeq ("$(origin M)", “command line”) //如果定義了,此句用來判斷M是否從命令行來
        KBUILD_EXTMOD := $(M)
    endif
endif

以下是來自:從 2.4 到 2.6:Linux 內(nèi)核可裝載模塊機制的改變對設(shè)備驅(qū)動的影響

清單3:2.6 內(nèi)核模塊的Makefile模板

#Makefile 2.6 
ifneq ($(KERNELRELEASE),) 
    #kbuild syntax. dependency relationshsip of files and target modules are listed here. 
    mymodule-objs := file1.o file2.o
    obj-m := mymodule.o
else
    PWD := $(shell pwd)
    KVER ?=?$(shell uname -r) KDIR:=/lib/modules/$(KVER)/build
    all: 
        $(MAKE) -C?$(KDIR ) M=(PWD) modules
    clean: rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif

????????KERNELRELEASE是在內(nèi)核源碼的頂層Makefile中定義的一個變量,在第一次讀取執(zhí)行此Makefile時,KERNELRELEASE沒有被定義, 所以make將讀取執(zhí)行else之后的內(nèi)容。

如果make的目標是clean,直接執(zhí)行clean操作,然后結(jié)束。

當make的目標為all時,-C $(KDIR?) 指明跳轉(zhuǎn)到內(nèi)核源碼目錄下讀取那里的Makefile?(解決M這個變量的定義問題,和KERNELRELEASE變量賦值問題); M=(PWD) 表明然后返回到當前目錄繼續(xù)讀入、執(zhí)行當前的Makefile。當從內(nèi)核源碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續(xù)讀取else之前的內(nèi)容。else之前的內(nèi)容為kbuild語法的語句, 指明模塊源碼中各文件的依賴關(guān)系,以及要生成的目標模塊名。mymodule-objs := file1.o file2.o表示mymoudule.o 由file1.o與file2.o 連接生成。obj-m := mymodule.o表示編譯連接后將生成mymodule.o模塊。

補充一點,"$(MAKE) -C?( KDIR ) M=(PWD)“與”$(MAKE) -C?(KDIR ) SUBDIRS=(PWD)"的作用是等效的,后者是較老的使用方法。推薦使用M而不是SUBDIRS,前者更明確。

通過以上比較可以看到,從Makefile編寫來看,在2.6內(nèi)核下,內(nèi)核模塊編譯不必定義復(fù)雜的CFLAGS,而且模塊中各文件依賴關(guān)系的表示簡潔清晰。

針對要編譯的模塊的過程,我猜測應(yīng)該是:(1)讀取模塊的makefile,因為沒有定義KERNELRELEASE變量,所以先走else分支,獲得KDIR等信息;(2)然后執(zhí)行make all,發(fā)現(xiàn)需要走make -C $(KDIR) M=$(PWD) modules;(3)跳轉(zhuǎn)到$(KDIR)目錄,讀取該目錄下的makefile,得到KERNELRELEASE變量和M的定義和值,以及其他所需要的內(nèi)容;(4)跳轉(zhuǎn)到模塊代碼目錄,再讀取makefile,發(fā)現(xiàn)if已經(jīng)成立,走if;(5)走make modules編譯模塊代碼生成ko文件。至于為什么這樣,參考linux KBuild MakeFile介紹 之二-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-757261.html

到了這里,關(guān)于編譯linux內(nèi)核模塊時的make -C M= modules的參數(shù)說明的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux 編譯內(nèi)核模塊出現(xiàn)--Unknown symbol mcount

    Linux suse: 在編譯SUSE Linux Enterprise Server 12 SP時,使用低版本的docker鏡像編譯內(nèi)核模塊時,加載內(nèi)核模塊時出現(xiàn): 加載內(nèi)核模塊時: (1) 指示系統(tǒng)可能受到 Spectre V2 漏洞的影響,并且正在加載的模塊沒有使用 retpoline 編譯器進行編譯。 Spectre V2(CVE-2017-5715)是 Spectre 漏洞家族

    2024年02月11日
    瀏覽(85)
  • 【嵌入式Linux】編譯應(yīng)用和ko內(nèi)核模塊Makefile使用記錄

    【嵌入式Linux】編譯應(yīng)用和ko內(nèi)核模塊Makefile使用記錄

    在Makefile中,變量的賦值可以使用以下幾種方式: = :最基本的賦值符號,表示簡單的延遲展開(lazy expansion)方式。變量的值將會在使用變量的時候進行展開。 := :立即展開(immediate expansion)的賦值方式。變量的值在賦值的時候立即展開,并且在后續(xù)的使用中不再改變。

    2024年02月08日
    瀏覽(24)
  • 從module_init看內(nèi)核模塊

    module_init是linux內(nèi)核提供的一個宏, 可以用來在編寫內(nèi)核模塊時注冊一個初始化函數(shù), 當模塊被加載的時候, 內(nèi)核負責(zé)執(zhí)行這個初始化函數(shù). 在編寫設(shè)備驅(qū)動程序時, 使用這個宏看起來理所應(yīng)當, 沒什么特別的, 但畢竟我還是一個有點追求的程序員嘛:P, 這篇文章是我學(xué)習(xí)module_init相

    2024年02月14日
    瀏覽(10)
  • 內(nèi)核模塊(編譯方法)

    內(nèi)核模塊(編譯方法)

    目錄 一、向內(nèi)核添加新功能 1.1 靜態(tài)加載法: 1.2 動態(tài)加載法: a、新功能源碼與Linux內(nèi)核源碼在同一目錄結(jié)構(gòu)下時 b、新功能源碼與Linux內(nèi)核源碼不在同一目錄結(jié)構(gòu)下時 c、主機ubuntu下使用ko文件 d、開發(fā)板Linux下使用ko文件 二、內(nèi)核模塊基礎(chǔ)代碼解析 Linux內(nèi)核的插件機制——內(nèi)

    2024年02月09日
    瀏覽(11)
  • 軟件課設(shè)(Ⅲ)——padavan-ng編譯以及內(nèi)核模塊修改

    軟件課設(shè)(Ⅲ)——padavan-ng編譯以及內(nèi)核模塊修改

    我記得今年的很多筆試面試都遇到了linux相關(guān)的操作,答題狀況都挺……昂。算是補課吧,正好大四的畢業(yè)實習(xí)、軟3還有研0的項目都需要linux的環(huán)境進行推進,記錄一下,聊作紀念。 實驗要求 編譯系統(tǒng),下載并提交,驗收的時候,我會找MIPS板子,讓大家下載驗證。 編譯一個

    2024年02月02日
    瀏覽(22)
  • Linux2.6內(nèi)核配置說明

    maturity level options 代碼成熟度選項 Prompt for development and/or incomplete code/drivers 顯示尚在開發(fā)中或尚未完成的代碼與驅(qū)動.除非你是測試人員或者開發(fā)者,否則請勿選擇 setup 常規(guī)設(shè)置 Local version - append to kernel release 在內(nèi)核版本后面加上自定義的版本字符串(小于64字符),可以用\\\"uname

    2024年02月14日
    瀏覽(46)
  • 【linux內(nèi)核】Debian內(nèi)核編譯

    【linux內(nèi)核】Debian內(nèi)核編譯

    列出 Debian 內(nèi)各種版本的核心軟件包 apt安裝軟件包 編譯內(nèi)核源碼 安裝內(nèi)核 更新grub 參考: 8.10.?編譯內(nèi)核 (debian.org) Debian編譯內(nèi)核教程 - 時光旅行的懶貓 - 博客園 (cnblogs.com) 內(nèi)核編譯方法-tony_ayuan-ChinaUnix博客

    2024年02月17日
    瀏覽(48)
  • Maven自定義腳手架(多module模塊)+自定義參數(shù)

    Maven自定義腳手架(多module模塊)+自定義參數(shù)

    視頻教程:Maven保姆級教程 Maven入門教程(一):安裝Maven環(huán)境 Maven入門教程(二):idea/Eclipse使用Maven Maven入門教程(三):Maven語法 Maven入門教程(四):Nexus私服 Maven入門教程(五):自定義腳手架 視頻教程: Maven保姆級教程 腳手架是一個項目模板,包含常用的工程結(jié)構(gòu)、代碼。 腳手

    2024年02月12日
    瀏覽(28)
  • 使用cmake編譯opencv過程中的可選參數(shù)說明

    使用cmake編譯opencv過程中的可選參數(shù)說明

    opencv版本:4.5.5 通過源碼編譯opencv時,cmake可以帶有很多可選參數(shù),這里對這些可選參數(shù)進行說明。 配置選項可以通過幾種不同的方式設(shè)置: 命令行:cmake-Doption=value… 初始緩存文件:cmake-C my_options.txt… 通過Cmake-GUI進行設(shè)定 在本參考中,我們將使用常規(guī)命令行。 最常用和有

    2024年02月16日
    瀏覽(16)
  • Linux內(nèi)核學(xué)習(xí)(包含Linux 2.6內(nèi)核編譯安裝流程)

    Linux內(nèi)核學(xué)習(xí)(包含Linux 2.6內(nèi)核編譯安裝流程)

    Linux內(nèi)核官方網(wǎng)站為:http://www.kernel.org 或者使用git將源碼clone下來(我這里使用的版本為2.6): clone下來的源碼目錄結(jié)構(gòu)如下:? 其中比較重要的目錄的官方描述如下: 對應(yīng)的中文描述如下: 由于centos7.6初始gcc版本為4.8.5,而編譯內(nèi)核需要的最低版本為5.1.0,所以需要安裝高

    2024年02月07日
    瀏覽(53)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包