歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 基於x86體系結構分析Linux-2.6.26內核編譯過程

基於x86體系結構分析Linux-2.6.26內核編譯過程

日期:2017/2/28 15:56:35   编辑:Linux教程

1. Makefile的分析:

1)Linux內核編譯簡述:

Linux2.6內核引入了kbuild機制,通過makemenuconfig配置把配置信息保存到.config

文件中,當.config文件被改變之後,在重新編譯,Kbuild能夠保證只進行最小化的編譯。

Linux內核的編譯系統主要包括的文件:

交叉編譯工具:是編譯生成的可執行文件,負責提供內核編譯過程中的交互,並把用戶配置交互的結果保存到.config文件。

Kconfig文件:位於各個子目錄下,其定義了交互配置時的菜單信息。

.config文件:內核配置文件,有配置工具生成.config文件。(即配置內核選項中出現的y,m,空)。

Scripts/Makefiel:接受make相關的命令,並根據命令中的參數進行相應的操作。最主要的操作時編譯內核文件的vmlinux和相關的模塊文件。

KbuildMakefies:分布在各個目錄下,與Makefile不同。

*.cmd文件:.cmd文件用於保存的歷史編譯參數和依賴信息,為以後的是否需要重新編譯相關文件提供依據和參考。

2)內核編譯過程分析:

編譯過程,是由make命令引發的一系列操作。我們敲入的make命令,會找到相應的makefile文件,去執行其中的命令規則的。因為我們會在內核源文件的根目錄下執行make命令,所以首先會從頂層的makefile中開始執。只使用make命令,即沒有任何參數的情況之下,make會執行的是Makefile文件中的默認規則,即all:vmlinux這個規則。

vmlinux:$(vmlinux-lds)$(vminux-init)$(vmlinux-main)vmlinux.o$(kallsyms.o) F

這樣可以看出vmlinux的依賴的幾項內容了。

對應這樣的幾個依賴文件,分別進行分析。

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

vmlinux-init:= $(head-y) $(init-y)

vmlinux-main:= $(core-y) $(libs-y) $(drivers-y) $(net-y)

這些就是以上三個依賴項的定義了。vmlinux-lds的定義已經很清楚了,就是對應目錄arch/x86/kernel/下的vmlinux.lds了。至於vmlinux-init的定義,就得到arch/x86/makefile文件中去看了。因為頂層的Makefile文件把這個Makefile文件也include進去了。

其中head-y如下:

head-y:= arch/x86/kernel/head_$(BITS).o

head-y+= arch/x86/kernel/head$(BITS).o

head-y+= arch/x86/kernel/head.o

head-y+= arch/x86/kernel/init_task.o

至於BITS,按照要求之考慮32為的情況,即把BITS代換為32就可以了。所以,head-y有三個重要的文件組成,即head_32.S,head32.c,init_task.o文件。這也說明了其是與體系結構相關的。

其中那個init-y如下:

init-y := init/

………

vmlinux-all := $(vmlinux-init) $(vmlinux-main)

vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y)$(init-m) \

$(core-y) $(core-m) $(drivers-y) $(drivers-m) \

$(net-y) $(net-m) $(libs-y) $(libs-m)))

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

…………

這樣可以看出,init-y是與體系結構無關的。一種涉及到了一個patsubs函數替換的工作。

其中還有core-y:

core-y := usr/

……

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

……

vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m)\

$(core-y) $(core-m) $(drivers-y) $(drivers-m) \

$(net-y) $(net-m) $(libs-y) $(libs-m)))

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

vmlinux-main:= $(core-y) $(libs-y) $(drivers-y) $(net-y)

經過分析,分析core-y的定義,分析core-y中既包含體系結構相關的,又包含體系結構無關的內容。

當然,沒有把每一個文件都分析的很透徹了。

Copyright © Linux教程網 All Rights Reserved