娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

【IMX6ULL學習筆記】七、Linux 頂層Makefile

發布者:BlissfulDreams最新更新時間:2025-03-03 來源: cnblogs關鍵字:Linux 手機看文章 掃描二維碼
隨時隨地手機看文章

一、Linux 工程目錄分析

image

二、頂層 Makefile 詳解

1、配置工程,生成.config配置文件:

make xxx_defconfig

會調用頂層的Makefile的 %config 規則。


第 534 行:引用 arch/arm/Makefile 這個文件,這個文件很重要, zImage、uImage 等這些文件就是由 arch/arm/Makefile 來生成的。

第 540 行:%config 規則: %通配符,當輸入“make xxx_defconfig”的時候就會匹配到%config 目標


%config: scripts_basic outputmakefile FORCE

    $(Q)$(MAKE) $(build)=scripts/kconfig $@

第一步:依賴部分

目標 %config 依賴于 scripts_basic、outputmakefile、FORCE


①FORCE目標:

FORCE 在頂層 Makefile的 1610 行有如下定義:


PHONY += FORCE

FORCE:

FORCE 是沒有規則和依賴的,所以每次都會重新生成 FORCE。當 FORCE 作為其他目標的依賴時,由于 FORCE 總是被更新過的,因此依賴所在的規則總是會執行的。即將FORCE當做依賴時,對應的目標規則總是會被執行。


②scripts_basic目標:

image

該目標會執行以下命令:


$(Q)$(MAKE) $(build)=scripts/basic

$(Q)rm -f .tmp_quiet_recordmcount

其中:


Q是顯示方式:靜默make -s;詳細make V=1;不顯示make V=0

MAKE=make

build定義在scriptskbuild.include

    build := -f $(srctree)/scripts/Makefile.build obj

    展開后:

    build := -f ./scripts/Makefile.build obj

image

展開后:


@make -f ./scripts/Makefile.build obj=scripts/basic

@rm -f .tmp_quiet_recordmcount

最終會調用文件./scripts/Makefile.build


③outputmakefile目標:

image

可以通過 echo 查看 KBUILD_SRC 為空:


mytest:

    @echo KBUILD_SRC = $(KBUILD_SRC)

所以該目標規則沒有執行如何命令。


第二步:命令部分

目標 %config 依賴于 scripts_basic、outputmakefile、FORCE ,執行以下命令:


 $(Q)$(MAKE) $(build)=scripts/kconfig $@

展開:


make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

也跟文件./scripts/Makefile.build 有關


第三步:Makefile.build

上面的分析最后指向以下兩條命令:


make -f ./scripts/Makefile.build obj=scripts/basic

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

1、 scripts_basic 目標對應的命令:

make -f ./scripts/Makefile.build obj=scripts/basic

打開文件 scripts/Makefile.build,有如下代碼


# Modified for U-Boot

prefix := tpl

src := $(patsubst $(prefix)/%,%,$(obj))

ifeq ($(obj),$(src))

prefix := spl

src := $(patsubst $(prefix)/%,%,$(obj))

ifeq ($(obj),$(src))

prefix := .

endif

endif

# The filename Kbuild has precedence over Makefile

kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))

kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)

include $(kbuild-file)

使用@echo打印各個變量值,結果如下:


src= scripts/basic

kbuild-dir = ./scripts/basic

kbuild-file = ./scripts/basic/Makefile

include ./scripts/basic/Makefile

其中src的值即為obj=scripts/basic的值,并且包含了scripts/basic/目錄下的Makefile。


make執行時未指定目標,會執行Makefile.build中的默認目標,如下:


__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))

$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target))

$(subdir-ym) $(always)

@:

其中KBUILD_BUILTIN = 1、KBUILD_MODULES = 0,展開后即為:


__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)

@:

在 scripts/Makefile.build 的默認執行目標末尾使用@echo 打印各變量值,得:


builtin-target =

lib-target =

extra-y =

subdir-ym =

always = scripts/basic/fixdep scripts/basic/bin2c

展開后只剩 always ,即 $(always) = scripts/basic/fixdep scripts/basic/bin2c,因此需要先編譯scripts/basic/fixdep.c 和 scripts/basic/bin2c.c 生成fixdep、bin2c這個兩個軟件。


2、 %config 目標對應的命令:

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

src的值即為obj=scripts/basic的值,所以Makefile.build中各個變量值如下:


src= scripts/kconfig

kbuild-dir = ./scripts/kconfig

kbuild-file = ./scripts/kconfig/Makefile

include ./scripts/kconfig/Makefile

include包含了./scripts/kconfig目錄下的Makefile,執行make時會調用scripts/kconfig/ Makefile中的內容,此文件有如下所示內容:


%_defconfig: $(obj)/conf

    $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)


# Added for U-Boot (backward compatibility)

%_config: %_defconfig

    @:

目標%_defconfig 剛好和我們輸入的 xxx_defconfig 匹配,依賴為$(obj)/conf,展開后就是 scripts/kconfig/conf,該依賴會編譯 scripts/kconfig/conf.c 生成 conf 這個軟件。


得到 scripts/kconfig/conf 以后就要執行目標%_defconfig 的命令:


 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

將其展開就是:


@ scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig

結果是將配置輸出到.config 文件中,最終生成 Linux 根目錄下的.config 文件。


2、make 生成 vmlinux、zImag、uImag 等文件

make 或 make all  //編譯linux,未指定目標將執行Makefile中默認目標

image

_all 的依賴如下圖所示:

image

如果 KBUILD_EXTMOD(編譯模塊) 為空的話 _all 依賴于all,all 定義如下:


all: vmlinux

image


(1)、vmlinux依賴分析:

vmlinux 依賴 scripts/link-vmlinux.sh 和 $(vmlinux-deps) ,如下:

image

上圖第912 行定義了 vmlinux-deps,值為:


vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)

image

上圖第907行:


KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds

其中 SRCARCH=arm,展開即:


KBUILD_LDS= arch/arm/kernel/vmlinux.lds

綜上所述,vmlinux 的依賴為:


scripts/link-vmlinux.sh、$(head-y) 、$(init-y)、$(core-y) 、$(libs-y) 、$(drivers-y) 、$(net-y)、arch/arm/kernel/vmlinux.lds 和 FORCE

重點來看一下

(

h

e

a

d

?

y

)

(init-y)、

(

c

o

r

e

?

y

)

(libs-y) 、

(

d

r

i

v

e

r

s

?

y

)

(net-y)這六個變量的值:


①head-y依賴:

head-y 定義在文件 arch/arm/Makefile 中,內容如下:


head-y := arch/arm/kernel/head$(MMUEXT).o

不使能 MMU 時 MMUEXT=-nommu,使能 MMU 時為空,因此 head-y 最終的值為:


head-y = arch/arm/kernel/head.o

②init-y、drivers-y、net-y依賴:

在頂層 Makefile 中有如下代碼:


init-y := init/

drivers-y := drivers/ sound/ firmware/

net-y := net/

......

init-y := $(patsubst %/, %/built-in.o, $(init-y))

drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))

net-y := $(patsubst %/, %/built-in.o, $(net-y))

init-y、libs-y、drivers-y 和 net-y 最終的值為:


init-y = init/built-in.o

drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o

net-y = net/built-in.o

③lib-y依賴

libs-y 基本和 init-y 一樣,在頂層 Makefile 中存在如下代碼:


libs-y := lib/

......

libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))

libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))

libs-y := $(libs-y1) $(libs-y2)

libs-y 應該等于“lib.a built-in.o”,這個只正確了一部分!因為在 arch/arm/Makefile 中會向 libs-y 中追加一些值,代碼如下:


libs-y := arch/arm/lib/ $(libs-y)

arch/arm/Makefile 將 libs-y 的值改為了:arch/arm/lib $(libs-y),展開以后為:


libs-y = arch/arm/lib lib/

libs-y 最終應該為:


libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o

④core-y依賴

core-y 和 init-y 也一樣,在頂層 Makefile 中有如下代碼:


core-y := usr/

......

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

但是在 arch/arm/Makefile 中會對 core-y 進行追加,代碼如下:


core-$(CONFIG_FPE_NWFPE)  += arch/arm/nwfpe/

core-$(CONFIG_FPE_FASTFPE)  += $(FASTFPE_OBJ)

core-$(CONFIG_VFP)    += arch/arm/vfp/

core-$(CONFIG_XEN)    += arch/arm/xen/

core-$(CONFIG_KVM_ARM_HOST)   += arch/arm/kvm/

core-$(CONFIG_VDSO)   += arch/arm/vdso/


# If we have a machine-specific directory, then include it in the build.

core-y        += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/

core-y        += arch/arm/probes/

core-y        += arch/arm/net/

core-y        += arch/arm/crypto/

core-y        += arch/arm/firmware/

core-y        += $(machdirs) $(platdirs)

第 1~6 行:根據不同的配置向 core-y 追加不同的值,比如使能 VFP 的話就會在 .config 中有 CONFIG_VFP=y 這一行,那么 core-y 就會追加“arch/arm/vfp/”。

第 9~14 行:就是對 core-y 直接追加的值。


在頂層 Makefile 中有如下一行:


core-y := $(patsubst %/, %/built-in.o, $(core-y))

經過上述代碼的轉換,最終 core-y 的值為:


core-y = usr/built-in.o

        arch/arm/vfp/built-in.o

        arch/arm/vdso/built-in.o

        arch/arm/kernel/built-in.o

        arch/arm/mm/built-in.o

        arch/arm/common/built-in.o

        arch/arm/probes/built-in.o

        arch/arm/net/built-in.o

        arch/arm/crypto/built-in.o

        arch/arm/firmware/built-in.o

        arch/arm/mach-imx/built-in.o

        kernel/built-in.o

        mm/built-in.o

        fs/built-in.o

        ipc/built-in.o

        security/built-in.o

        crypto/built-in.o

        block/built-in.o

(2)、vmlinux命令分析:

vmlinux 的依賴分析完成,接下來分析 vmlinux 執行的命令:


+$(call if_changed,link-vmlinux)

該命令最終會調用 scripts/link-vmlinux.sh 這個腳本,根據 arch/arm/kernel/vmlinux.lds 鏈接文件,將各個子目錄下的所有 built-in.o、*.a 鏈接生成 vmlinux。


(3)、vmlinux生成zImag、uImag等:

頂層Makefile中有如下定義:


include arch/$(SRCARCH)/Makefile

export KBUILD_DEFCONFIG KBUILD_KCONFIG

image

展開即:


include arch/arm/Makefile

在 arch/arm/Makefile 中的默認執行目標如下:

image

展開即:


all : zImag dtbs

arch/arm/Makefile 中還有如下定義:


BOOT_TARGETS  = zImage Image xipImage bootpImage uImage

INSTALL_TARGETS = zinstall uinstall install


PHONY += bzImage $(BOOT_TARGETS) $(INSTALL_TARGETS)


$(BOOT_TARGETS): vmlinux

  $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

image

展開即:


zImage Image xipImage bootpImage uImage: vmlinux

    $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

Makefile 默認執行的目標依賴于 zImag ,要編譯 zImage,那么命令展開以后如下所示:


@ make -f ./scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/boot/zImage

是使用 scripts/Makefile.build 文件來完成 vmlinux 到 zImage 的轉換。


關鍵字:Linux 引用地址:【IMX6ULL學習筆記】七、Linux 頂層Makefile

上一篇:【IMX6ULL學習筆記】八、Linux啟動流程
下一篇:【IMX6ULL學習筆記】六、U-BOOT環境變量與Linux啟動

推薦閱讀最新更新時間:2025-06-05 12:11

迅為IMX6ULL開發板-Debian文件系統的構建
1.安裝Qumu和Debootstrap 由于我們是在Ubuntu上構建的debian的文件系統,所以安裝這倆個工具我們直接使用apt-get命令即可。命令如下: apt-get install binfmt-support qemu qemu-user-static debootstrap 2.抽取Debain文件系統 抽取文件系統我們使用的是debootstrap命令,我們執行以下命令即可從debian下載源中獲取到文件系統: debootstrap --arch=armhf --foreign buster root https://mirrors.tuna 命令參數解析: arch 指定了CPU 架構 buster 是d
[單片機]
迅為<font color='red'>IMX6ULL</font>開發板-Debian文件系統的構建
LINUX下ARM匯編的常用指令解析
1.ldr 和 str : (1) ldr 作為指令,叫做寄存器加載指令。將內存中的值加載到寄存器中。 (2) ldr 作為偽指令,實現一個32位常數或地址值加載到寄存器中。后面加載的常量或地址值標號前面必須有一個 “=” ,編譯器會將偽指令替換成指令實現。 (3) str 將寄存器中的值保存到內存單元中。 2..long 偽操作,給數值分配內存單元。 start: virable: .long start 如上,表示將start表示的值存到virable所代表的內存中。 virable: .long 0x66666666 如上,表示將0x66666666存入virable所在的內存單元中。 3.adr
[單片機]
Linux驅動之同步、互斥、阻塞的應用
同步、互斥、阻塞的概念: 同步:在并發程序設計中,各進程對公共變量的訪問必須加以制約,這種制約稱為同步。 互斥機制:訪問共享資源的代碼區叫做臨界區,這里的共享資源可能被多個線程需要,但這些共享資源又不能被同時訪問,因此臨界區需要以某種互斥機制加以保護,以確保共享資源被互斥訪問。 阻塞與非阻塞:阻塞調用是指調用結果返回之前,當前線程會被掛起,調用線程只有在得到結果之后才會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程,而是直接返回。 在按鍵驅動的例子中,如果有多個應用程序調用按鍵驅動的設備文件,這時候就要利用同步與互斥的概念對這個種情況進行處理: 1、利用原子變量標志來判斷設備文件是否被打開,
[單片機]
IMX257 linux設備驅動之Cdev結構
一、CDEV結構 /* *內核源碼位置 *linux2.6.38/include/linux/cdev.h */ struct cdev { struct kobject kobj; struct module *owner; //一般初始化為:THIS_MODULE const struct file_operations *ops; //字符設備用到的例外一個重要的結構體file_operations,cdev初始化時與之綁定 struct list_head list; dev_t dev; //主設備號24位 與次設備號8位,dev_t為32
[單片機]
IMX257 <font color='red'>linux</font>設備驅動之Cdev結構
英特爾 Gaudi2C AI 加速卡現身 Linux 驅動,消息稱是中國特供版
12 月 20 日消息,今年 7 月,英特爾面向中國市場推出了一款 Gaudi2 處理器,主要應用于加速 AI 訓練及推理。 據 Phoronix 報道,還有一個新的加速卡版本將至,英特爾已在其 Linux 驅動程序中添加了對 Gaudi2C 的支持。 目前尚不清楚 Gaudi2C 和 Gaudi2 之間的區別,報道稱可能是一個“有限”變體,依然是中國市場特供產品。外媒 tomshardware 也表示可能是 Gaudi2 的精簡版。 Linux 補丁顯示,該產品是一個 PCI 版本 ID 為“3”的 Gaudi2,并且遵循與 Gaudi2 和 Gaudi2B 版本相同的驅動程序代碼路徑。 據IT之家援引 Serve th
[嵌入式]
中國首個接入大模型的Linux操作系統來了
近日,開源國產操作系統deepin宣布正式接入大模型,多款自研應用迎來智能化升級,據悉,這是中國首個接入大模型的操作系統。 據deepin社區介紹,目前UOS AI實現了國內外主流大模型的能力接入,并封裝成deepin的AI底層公共能力;同時,將把UOS AI逐步開源給第三方應用,讓更多應用可以在deepin上直接調用大模型。 據悉,deepin選擇了用戶常用的智能全局搜索、郵件、瀏覽器三大應用,率先開啟了AI能力。 其中,智能全局搜索支持三大核心能力,包括自然語言搜索、圖片內容搜索、文檔內容搜索,可實現“一鍵搜索,一鍵直達”的便捷體驗。 官方表示,不管是關鍵詞文件名查找,還是文件內容查找、圖片OCR查
[嵌入式]
中國首個接入大模型的<font color='red'>Linux</font>操作系統來了
Linux高級驅動】觸摸屏驅動的移植
觸摸屏驅動的移植 流程 注意:看框架圖 1.添加input.c組件 Device Drivers --- Input device support --- Generic input layer (needed for keyboard, mouse, ...) 2.添加evdev.c組件 Device Drivers --- Input device support --- * Event interface 3.添加s3c2410_ts.c觸摸屏驅動 修改driver/input/touchscreen/Kconfig config TOUCHSCREEN_S3C2410 tristate Samsun
[單片機]
ARM芯片基于linux嵌入式操作系統實現的CMU控制器方案
zigbee無線通信與linux嵌入式操作系統是電子人都經常接觸的,在這里我們設計了一種以ARM芯片S3C2440為硬件平臺,基于linux嵌入式操作系統所實現的CMU控制器。通過zigbee無線通信協議將CMU與各個家電無線節點和傳感器節點相連,并通過無線路由器連接以太網實現遠程控制的智能家居網絡系統。在硬件芯片選擇和電路設計方面優化了系統的結構,大大降低了系統的成本,改善了系統的性能。 伴隨著數字化、網絡化的進程。智能化的浪潮席卷了世界的每個角落,成為勢不可擋的歷史趨勢,在這種形式下智能網絡家居技術應運而生,它依靠3C技術(Computer TechnologyCommunication Technology Contro
[單片機]
ARM芯片基于<font color='red'>linux</font>嵌入式操作系統實現的CMU控制器方案
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 沐川县| 陇西县| 道孚县| 迁安市| 班戈县| 隆安县| 库伦旗| 烟台市| 东乌珠穆沁旗| 伊金霍洛旗| 靖边县| 修水县| 庐江县| 阿瓦提县| 新晃| 凌海市| 井研县| 金昌市| 高州市| 南陵县| 黄冈市| 延长县| 潞城市| 镇康县| 庆城县| 洱源县| 阜阳市| 岳西县| 西充县| 湘阴县| 赤壁市| 白朗县| 墨玉县| 苍山县| 宽城| 枣庄市| 东平县| 景洪市| 广宗县| 崇仁县| 屯留县|