Linux核心Makefile編譯產生核心目標檔案的過程

來源:互聯網
上載者:User
 

#based on v2.6.26 kernel

Linux核心Makefile編譯產生核心目標檔案的過程

直接執行make的編譯過程

  • 1.先找到進入點(進入點問題)

    #編譯核心line502,直接執行make預設編譯此項 all: vmlinux   #編譯模組line1037,選擇編譯模組的話會到這裡,另外還有其他許多all:target存在,為什麼預設執行all: vmlinux ? all: modules
  • 2.繼續找vmlinux目標
    # vmlinux image - including updated kernel symbols # vmlinux目標在line806 vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE # FORCE是偽目標,make假定偽目標的時間戳記總是最新的,即總是被修改過,因此以它為“依賴”的“目標”“vmlinux”在每次make的時候都會被編譯。
  • 3.理解$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main)這個變數的作用

    # line656 vmlinux-init := $(head-y) $(init-y) # -y是指配置為yes表示加入核心,-m是指配置為module,-n是指配置為no表示不加入核心 vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y) vmlinux-all  := $(vmlinux-init) $(vmlinux-main) vmlinux-lds  := arch/$(SRCARCH)/kernel/vmlinux.lds # SRCARCH為體繫結構名,這裡我們使用x86

產生的vmlinux.lds目標檔案是連結產生vmlinux映像的連結描述檔案ld script,從該檔案中我們大致可以知道vmlinux映像的頭部是$(head-y) $(init-y),vmlinux映像的主體部分是$(core-y) $(libs-y) $(drivers-y) $(net-y)等.具體我們可以仔細研究ld
script to make i386 Linux kernel.

vmlinux映像 #################################################### #             #                                    # #  $(head-y)  #  $(core-y) $(libs-y)               # #  $(init-y)  #  $(drivers-y) $(net-y),etc.        # #             #                                    # ####################################################
  • 找出$(vmlinux-init)或者說$(head-y) $(init-y)包含那些檔案

先找init-y,輕易搞定如下:

# line452 init-y          := init/ # line621 init-y          := $(patsubst %/, %/built-in.o, $(init-y)) ## 表示將$(init-y)列表中"/"替換為"/built-in.o",也就是最終init-y == init/built-in.o

init/built-in.o目標在init目錄下產生,其中包含start_kernel函數,這個函數是從啟動代碼進入linux kernel的點.

在根目錄下的Makefile檔案中我們找不到head-y的定義,那麼head-y肯定在某個被包含(include)進來的檔案中. 通過搜尋include我們發現head-y可能在/arch/x86/Makefile中.

# line431 include $(srctree)/arch/$(SRCARCH)/Makefile

果然,在/arch/x86/Makefile中找到head-y,

# line161 head-y := arch/x86/kernel/head_$(BITS).o ## BITS是CPU處理的位元的定義,我們使用的32位CPU,這裡直接使用32來代替,檔案也就是head_32.o head-y += arch/x86/kernel/head$(BITS).o # head32.o head-y += arch/x86/kernel/init_task.o
  • vmlinux映像產生的一般規則綜述

通過以上分析路徑

all --> vmlinux --> $(vmlinux-lds) $(vmlinux-init) --> $(head-y) $(init-y) -- --> built-in.o head32.o head_32.o init_task.o --> *.c *.S

我們可以有了一個大致的概念,那就是通過核心配置資訊,我們有了xxxx-y的目標列表,通過深度遍曆依次去產生這些目標,並最終產生了vmlinux.

至於核心配置資訊與xxxx-y的目標列表以及依然的目錄檔案等,是如何映射匹配的,還需要更仔細的分析.

  • bzimage - 對vmlinux映像的後續處理

並且在/arch/x86/Makefile中我們還可以發現對vmlinux映像的後續處理部分,後續處理之後的bzimage將會是

bzimage #################################################### #         #                  #                     # #  Setup  #  uncompress code #  compressed vmlinux # #         #                  #                     # ####################################################

接下來我們看看對vmlinux映像的後續處理部分的Makefile,首先要找到起點:

# line200 of /arch/x86/Makefile #### # boot loader support. Several targets are kept for legacy purposes  boot := arch/x86/boot  PHONY += zImage bzImage compressed zlilo bzlilo \          zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install  # Default kernel to build all: bzImage  # KBUILD_IMAGE specify target image being built                     KBUILD_IMAGE := $(boot)/bzImage zImage zlilo zdisk: KBUILD_IMAGE := arch/x86/boot/zImage  zImage bzImage: vmlinux         $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE) ## 進入arch/x86/boot目錄執行其Makefile         $(Q)mkdir -p $(objtree)/arch/$(UTS_MACHINE)/boot         $(Q)ln -fsn ../../x86/boot/bzImage $(objtree)/arch/$(UTS_MACHINE)/boot/bzImage  compressed: zImage
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.