1. 程式人生 > >2.16.1.做好內核分析的準備工作

2.16.1.做好內核分析的準備工作

鏈接 地方 vmlinux 準備 tmp 方法 1.3 ext usr

本節課開始建立工程、分析Makefile等,主要目的是為開始內核代碼的分析掃清障礙,做好準備工作。

2.16.1.1、刪除無用文件

(1)官方版本的kernel中是支持各種硬件架構、各種開發板的,因此有很多文件夾和文件和我們無關,在建立SI工程前應該刪掉這些家夥。
(2)我們現在分析的是開發板廠商九鼎科技移植好的針對X210開發板的kernel,因此其中一些無用文件已經被刪掉了。

2.16.1.2、建立SI工程並解析

(2)建立方法和uboot中當時講的是一樣的。

2.16.1.3、Makefile分析

(1)kernel的Makefile寫法和規則等和uboot的Makefile是一樣的,甚至Makefile中的很多內容都是一樣的。
(2)kernel的Makefile比uboot的Makefile要復雜,這裏我們並不會一行一行的詳細分析。
(3)Makefile中只有一些值得關註的我會強調一下,其他不強調的地方暫時可以不管。

(4)Makefile中剛開始定義了kernel的內核版本號。這個版本號挺重要(在模塊化驅動安裝時會需要用到),要註意會查,會改。[關註頂層目錄的makefile]
(5)在make編譯內核時,也可以通過命令行給內核makefile傳參(跟uboot配置編譯時傳參一樣)。譬如make O=xxx可以指定不在源代碼目錄下編譯,而到另外一個單獨文件夾下編譯。
(6)kernel的頂層Makefile中定義了2個變量很重要,一個是ARCH,一個是CROSS_COMPILE。ARCH決定當前配置編譯的路徑,譬如ARCH = arm的時候,將來在源碼目錄下去操作的arch/arm目錄。CROSS_COMPILE用來指定交叉編譯工具鏈的路徑和前綴。
(7)CROSS_COMPILE = xxx和ARCH = xxx和O=xxx這些都可以在make時通過命令行傳參的方式傳給頂層Makefile。
所以有時候你會看到別人編譯內核時:make O=/tmp/mykernel ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

2.16.1.4、鏈接腳本分析

(1)分析連接腳本的目的就是找到整個程序的entry
(2)kernel的連接腳本並不是直接提供的,而是提供了一個匯編文件vmlinux.lds.S,然後在編譯的時候再去編譯這個匯編文件得到真正的鏈接腳本vmlinux.lds。
(3)vmlinux.lds.S在arch/arm/kernel/目錄下。
(4)思考:為什麽linux kernel不直接提供vmlinux.lds而要提供一個vmlinux.lds.S然後在編譯時才去動態生成vmlinux.lds呢?
猜測:.lds文件中只能寫死,不能用條件編譯。但是我們在kernel中鏈接腳本確實有條件編譯的需求(但是lds格式又不支持),於是乎kernel工作者找了個投機取巧的方法,就是把vmlinux.lds寫成一個匯編格式,然後匯編器處理的時候順便條件編譯給處理了,得到一個不需要條件編譯的vmlinux.lds。
(5)入門在哪裏?從vmlinux.lds中ENTRY(stext)可以知道入口符號是stext,在SI中搜索這個符號,發現arch/arm/kernel/目錄下的head.S和head-nommu.S中都有[是head.S]。
(6)head.S是啟用了MMU情況下的kernel啟動文件,相當於uboot中的start.S。head-nommu.S是未使用mmu情況下的kernel啟動文件。

2.16.1.做好內核分析的準備工作