Exynos4412 内核移植(二)—— 内核编译过程分析
內核的編譯同樣是從Makefile 來分析:
一、內核源碼結構
Linux內核文件數目近2萬,出去其他架構CPU的相關文件,他們分別位于頂層目錄下的17個子目錄,各個目錄功能獨立,下面是常用目錄:
arch:體系結構相關代碼
ipc:進程調度相關代碼
mm:內存管理
Documentation:幫助文檔
net:網絡協議
lib:庫
scripts:編譯相關腳本工具
tools:編譯相關工具
drivers:設備驅動
fs:文件系統實現
對于ARM 架構的Exynos4412,其體系相關的代碼在arch/arm/目錄下,在后面進行的Linux移植時,開始的工作正式修改這個目錄下的文件。
二、Linux Makefile分析
內核中的哪些文件將被編譯?它們是怎樣被編譯的?它們連接時的順序如何確定?那個文件在最前面?哪些文件或函數先執行?這些都是通過Makefile 來管理的。從最簡單的角度來總結Makefile的作用,有以下3點:
1)-- 決定編譯哪些文件;
2)-- 怎樣編譯這些文件?
3)-- 怎樣連接這些文件,最重要的是它們的順序如何?
Linux 內核源碼中含有很多個Makefile文件,這些Makefile文件又要包含其他一些文件(比如配置信息、通用的規則等)。這些文件構成了 Linux 的Makefile 體系,可以分為下表中的5類:
| 名稱 | 描述 |
| 頂層Makefile | 他是所有Makefile文件的核心,從總體上控制內核的編譯和鏈接 |
| .config | 配置文件,在配置內核時產生。所有Makefile文件(包括頂層目錄及各級子目錄)都是根據.config來決定使用哪些文件 |
| arch/$(ARCH)/Makefile | 對應體系結構的Makefile,它用來決定哪些體系結構相關的文件參與內核的生成,并提供一些規則來生成特定格式的內核映像。 |
| scripts/makefile.* | Makefile公用的通用規則、腳本等 |
| kbuild Makefiles | 各級子目錄下的Makefile,他們相對簡單,被上一層Makefile調用來編譯當前目錄下的文件 |
以下根據見面總結的Makefile 的3大作用分析這5類文件。
1、決定編譯哪些文件
Linux內核的編譯過程從頂層Makefile開始,然后遞歸地進入各級子目錄調用他們的makefile,分為3個步驟:
a -- 頂層Makefile 決定內核根目錄下哪些子目錄將被編進內核;
b -- arch/$(ARCH)/Makefile 決定arch/$(ARCH)目錄下哪些文件、哪些目錄將被編進內核;
c -- 各級子目錄下的Makefile決定所在目錄下哪些文件將被編進內核,哪些文件將被編程模塊(即驅動程序),進入哪些子目錄繼續調用它們的Makefile。
a -- 先看步驟a,?頂層Makefile的編譯
在頂層Makefile 中可以看到如下內容:
可見,頂層Makefile將這14個子目錄分為5類:init-y、divers-y、net-y、libs-y和core-y。
我們可以看到,最重要的arch目錄沒有出現在內核中。它在arch/$(ARCH)/Makefile中被包含進內核,在頂層Makefile中直接包含了這個Makefile,如下所示:
對于ARCH變量,可以在執行make時傳入,比如“make ARCH=arm ...”。另外,對于非X86平臺,還需要指定交叉編譯工具,這也可以在執行make 命令時傳入,比如“make CROSS_COPILE=arm-linux- ..”。為了方便,常在頂層Makefile中進行如下修改。這樣執行make時就會將ARCH變量傳入
b -- 看步驟 b,arch/$(ARCH)/Makefile的編譯
對于步驟 b 的 arch/$(ARCH)/Makefile,以ARM為例,在arch/arm/Makefile 中可以看到如下內容:
從129行可知,除了剛面的5類子目錄外,又出現了一類:head-y,不過它直接以文件名出現;
arch/arm/Makefile 中類似第268-273行的代碼進一步擴展了core-y的內容,第276行擴展了libs-y的內容,這些都是體系相關的目錄;第261-265行中的CONFIG_在配置內核時定義,它的值有3種:y、m或空。y表示編進內核,m表示編為模塊,空表示不使用;
編譯內核時,將依次進入init-y、core-y、libs-y、drivers-y和net-y 所列出的目錄中執行它們的Makefile,每個子目錄都會生成一個 built-in.o(libs-y所列目錄下,有可能生成lib.a文件)。最后,head-y所表示的文件將和在這些built-in.o、lib.a 一起被連接成內核映像文件 vmlinux。
c -- 步驟 c 是如何進行的,各級子目錄下的Makefile的編譯
在配置內核時,生成配置文件.config。內核頂層Makefile使用如下語句間接包含.config 文件,以后就根據.config中定義的各個變量決定編譯哪些文件。值所以說是“間接”包含,試音為包含的是include/config/auto.conf 文件,而它只是將.config文件中的注釋去掉,并根據頂層Makefile中定義的變量增加一些變量而已。
2、怎樣編譯這些文件
即編譯選項、連接選項是什么。這些選項分3類:全局的,適用于整個內核代碼樹;局部的,僅適用于某個Makefile中的所有文件;個體的,僅適用于某個文件。
全局選項在頂層Makefile和arch/$(ARCH)/Makefile 中定義,這些選項的名稱為:CFLAGS、AFLAGS、LDFLAGS、ARFLAGS,他們分別是編譯C文件的選項、編譯匯編問價你的選項、連接文件的選項、制作庫文件的選項。
3、怎樣連接這些文件,它們順序如何
前面分析有哪些文件要編進內核時,頂層Makefile和arch/$(ARCH)/Makefile定義了6類目錄(或文件):head-y、init-y、drivers、libs-y 和 core-y。它們的初始值如下(以ARM體系為例)
arch/arm/Makefile 中:
頂層makefile 中:
可見,除head-y 外,其余的init-y、drivers-y等都是目錄名。在頂層Makefile 中,這IE目錄名的后面直接加上built-in.o 或 lib.a,表示要連接進內核的文件。
上面的patubst是個字符串處理函數,它的用法如下:
(patsubst pattern, replacement,text)
表示尋找“text”中符合格式“pattern”的字,用”replacement"替換它們。比如上面的init-y初值為“init/”,經過793行的交互后,“init-y” 變為“init/built - in.o”。
頂層Makefile中,再往下看:
對于ARM體系,連接腳本就是arch/arm/kernel/vmlinux.lds,它由 arch/arm/kernel/vmlinux/lds.S文件生成,先將生成的arch/arm/kernel/vmlinux.lds摘錄如下:
總結:
a -- 配置文件.config 中定義了一系列的變量,Makefile將結合它們來決定哪些文件被編進內核、哪些文件被編進模塊、涉及哪些子目錄;
b -- 頂層Makefile和arch/$(ARCH)/Makefile決定根目錄下哪些子目錄、arch/$(ARCH) 目錄下哪些文件和目錄將被編進內核;
c -- 最后,各級子目錄下的Makefile決定所在目錄下哪些文件將被編進內核,哪些文件將被變成模塊(即驅動程序),進入哪些子目錄繼續調用它們的Makefile;
d -- 頂層Nakedfile和arch/$(ARCH)/Makefile設置了可以影響所有文件的編譯、連接選項:CFLAGS、AFLAGS、LDFLAGS、ARFLAGS;
e -- 頂層Makefile按照一定的順序組織文件,根據連接腳本 arch/$(ARCH)/kernel/vmlinux.lds生成內核映像文件vmlinux。
總結
以上是生活随笔為你收集整理的Exynos4412 内核移植(二)—— 内核编译过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: snap7库C++版本对PLC数据的读写
- 下一篇: RHCS(概念篇)