日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内核启动流程分析(三)makefile

發(fā)布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内核启动流程分析(三)makefile 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • Linux內(nèi)核Makefile作用
  • Linux內(nèi)核Makefile文件分類
  • Makefile解析
  • 子目錄的Makefile
  • 架構(gòu)下面的Makefile
  • 頂層Makefile
  • Make解析
  • 總結(jié)

Linux內(nèi)核Makefile作用

Linux內(nèi)核Makefile文件分類

Makefile解析

詳細(xì)的解釋可以看/Documentation/kbuild/makefiles.txt

子目錄的Makefile

子目錄的makefile形式簡單,諸如下:

obj-$(CONFIG_DM9000) += dm9dev9000c.o

然后?CONFIG_DM9000是在auto.conf中定義,他是由.config中定義為y(內(nèi)核文件)或者m(編譯為.ko模塊),所以也就是形如

obj-y += xxx.o obj-m += xxx.o 如果沒有被定義則是 obj - +=xxx.o 不被處理

架構(gòu)下面的Makefile

arch/arm/Makefile

我們執(zhí)行命令make uImage并不在頂層的makefile,而是在架構(gòu)下面的makefile,所以它一定會被頂層的makefile包含

zImage Image xipImage bootpImage uImage: vmlinux$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

頂層Makefile

搜索下arch,在頂層的Makefile中找到包含了架構(gòu)下的Makefile

include $(srctree)/arch/$(ARCH)/Makefile export KBUILD_DEFCONFIG

可以繼續(xù)搜發(fā)現(xiàn)同時定義了arm架構(gòu),這是在補丁文件修改的

#ARCH ?= $(SUBARCH) ARCH ?= arm CROSS_COMPILE ?= arm-linux-

同時搜索下.config文件生成的auto.conf,也在頂層包含

ifeq ($(dot-config),1) # Read in config -include include/config/auto.conf

Make解析

總結(jié):最終在各個目錄下生成built-in.o,根據(jù)arch/$(ARCH)/kernel/vmlinux.lds的鏈接腳本鏈接

uiamge依賴于vmlinux,uImage實際就是頭部信息加上一個真正的內(nèi)核,也就是vmlinux就是真正的內(nèi)核

zImage Image xipImage bootpImage uImage: vmlinux$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

可以發(fā)現(xiàn)在頂層makefile存在以下,也就是說這也是默認(rèn)的目標(biāo)文件

all: vmlinux

繼續(xù)搜索目標(biāo)vmlinux的依賴

# vmlinux image - including updated kernel symbols vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE ifdef CONFIG_HEADERS_CHECK$(Q)$(MAKE) -f $(srctree)/Makefile headers_check endif$(call if_changed_rule,vmlinux__)$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@$(Q)rm -f .old_version

其中相關(guān)變量繼續(xù)搜索如下

vmlinux-init := $(head-y) $(init-y) vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y) vmlinux-all := $(vmlinux-init) $(vmlinux-main) vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds # vmlinux-lds:鏈接腳本。 # vmlinux-init:一些初始化代碼。 # vmlinux-main:一些主要的代碼(與內(nèi)核核心相關(guān)的)。

vmlinux-init

#頂層 /makefile init-y := init/ init-y := $(patsubst %/, %/built-in.o, $(init-y)) # 相當(dāng)于 init-y = init/built-in.o#架構(gòu) arch/arm/makefile head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o #這里MMUEXT 并沒有被定義,也就是最終就是 arch/arm/kernel/head.o arch/arm/kernel/init_task.o

patsubst分析

格式:$(patsubst <pattern>,<replacement>,<text> ) 名稱:模式字符串替換函數(shù)——patsubst。 功能:查找<text>中的單詞(單詞以“空格”、“Tab”或“回車”“換行”分隔)是否符合模式<pattern>,如果匹配的話,則以<replacement>替換。
  • pattern=%/在這里應(yīng)該是匹配所有的意思
  • replacement=%/built-in.o
  • text=init/

也就是說在init/下的所有文件名都被替換為+built-in.o,視頻講的是最后會被編譯為built-in.o,也就是相當(dāng)于init-y = init/built-in.o

vmlinux-main

core-y?內(nèi)核

vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y) # core-y core-y := usr/ core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ core-y := $(patsubst %/, %/built-in.o, $(core-y))

這里也用到了patsubst替換,也就是將上述目錄下的文件編譯為built-in.o,最終相當(dāng)于

core-y = usr/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

libs-y?庫

libs-y := lib/ # 在lib/中查找 替換為lib.a libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)) # 在lib/中查找 替換為built-in.o libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)) # 最終生成 built-in.o 和 lib.a libs-y := $(libs-y1) $(libs-y2)

同樣的,也就是在最終生成built-in.o和 替換為lib.a

drivers-y?驅(qū)動

drivers-y := drivers/ sound/ #(依賴了這兩個目錄) drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))

同樣的,也就是在最終生成built-in.o

net-y?網(wǎng)絡(luò)

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

同樣的替換,生成built-in.o

總結(jié)

從以上分析makefile可以兩大結(jié)果:第一個文件和鏈接腳本,以后分析內(nèi)核流程可以根據(jù)第一個文件順藤摸瓜一路跟蹤下去,鏈接腳本決定了內(nèi)核里的各個段是如何分布的,而每個段的文件順序就是上面文件順序。

總結(jié)

以上是生活随笔為你收集整理的内核启动流程分析(三)makefile的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。