當前位置:編程學習大全網 - 編程語言 - 如何編譯linux版本

如何編譯linux版本

編譯安裝內核

下載並解壓內核

內核下載官網:piled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' | sort > System.map

在進行程序設計時,會命名壹些變量名或函數名之類的符號。Linux內核是壹個很復雜的代碼塊,有許許多多的全局符號, Linux內核不使用符號名,而是通過變量或函數的地址來識別變量或函數名,比如不是使用size_t BytesRead這樣的符號,而是像c0343f20這樣引用這個變量。 對於使用計算機的人來說,更喜歡使用那些像size_t BytesRead這樣的名字,而不喜歡像c0343f20這樣的名字。內核主要是用c寫的,所以編譯器/連接器允許我們編碼時使用符號名,而內核運行時使用地址。 然而,在有的情況下,我們需要知道符號的地址,或者需要知道地址對應的符號,這由符號表來完成,符號表是所有符號連同它們的地址的列表。

Linux 符號表使用到2個文件: /proc/ksyms 、System.map 。/proc/ksyms是壹個“proc file”,在內核引導時創建。實際上,它並不真正的是壹個文件,它只不過是內核數據的表示,卻給人們是壹個磁盤文件的假象,這從它的文件大小是0可以看 出來。然而,System.map是存在於妳的文件系統上的實際文件。當妳編譯壹個新內核時,各個符號名的地址要發生變化,妳的老的System.map 具有的是錯誤的符號信息,每次內核編譯時產生壹個新的System.map,妳應當用新的System.map來取代老的System.map。

雖然內核本身並不真正使用System.map,但其它程序比如klogd, lsof和ps等軟件需要壹個正確的System.map。如果妳使用錯誤的或沒有System.map,klogd的輸出將是不可靠的,這對於排除程序故障會帶來困難。沒有System.map,妳可能會面臨壹些令人煩惱的提示信息。 另外少數驅動需要System.map來解析符號,沒有為妳當前運行的特定內核創建的System.map它們就不能正常工作。 Linux的內核日誌守護進程klogd為了執行名稱-地址解析,klogd需要使用System.map。System.map應當放在使用它的軟件能夠找到它的地方。執行:man klogd可知,如果沒有將System.map作為壹個變量的位置給klogd,那麽它將按照下面的順序,在三個地方查找System.map: /boot/System.map 、/System.map 、/usr/src/linux/System.map

System.map也有版本信息,klogd能夠智能地查找正確的映象(map)文件。

makefile menuconfig過程講解

當我們在執行make menuconfig這個命令時,系統到底幫我們做了哪些工作呢?這裏面壹***涉及到了壹下幾個文件我們來壹壹探討

Linux內核根目錄下的scripts文件夾

arch/$ARCH/Kconfig文件、各層目錄下的Kconfig文件

Linux內核根目錄下的makefile文件、各層目錄下的makefile文件

Linux內核根目錄下的的.config文件、arch/$ARCH/configs/下的文件

Linux內核根目錄下的 include/generated/autoconf.h文件

1)scripts文件夾存放的是跟make menuconfig配置界面的圖形繪制相關的文件,我們作為使用者無需關心這個文件夾的內容

2)當我們執行make menuconfig命令出現上述藍色配置界面以前,系統幫我們做了以下工作:

首先系統會讀取arch/$ARCH/目錄下的Kconfig文件生成整個配置界面選項(Kconfig是整個linux配置機制的核心),那麽ARCH環境變量的值等於多少呢?它是由linux內核根目錄下的makefile文件決定的,在makefile下有此環境變量的定義:

SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \

-e s/arm.*/arm/ -e s/sa110/arm/ \

-e s/s390x/s390/ -e s/parisc64/parisc/ \

-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \

-e s/sh[234].*/sh/ )

..........

export KBUILD_BUILDHOST := $(SUBARCH)

ARCH ?= $(SUBARCH)

CROSS_COMPILE ?=

或者通過 make ARCH=arm menuconfig命令來生成配置界面

比如教務處進行考試,考試科數可能有外語、語文、數學等科,這裏我們選擇了arm科可進行考試,系統就會讀取arm/arm/kconfig文件生成配置選項(選擇了arm科的卷子),系統還提供了x86科、milps科等10幾門功課的考試題

3)假設教務處比較“仁慈”,為了怕某些同學做錯試題,還給我們準備了壹份參考答案(默認配置選項),存放在arch/$ARCH/configs/目錄下,對於arm科來說就是arch/arm/configs文件夾:

此文件夾中有許多選項,系統會讀取哪個呢?內核默認會讀取linux內核根目錄下.config文件作為內核的默認選項(試題的參考答案),我們壹般會根據開發板的類型從中選取壹個與我們開發板最接近的系列到Linux內核根目錄下(選擇壹個最接近的參考答案)

4).config

假設教務處留了壹個心眼,他提供的參考答案並不完全正確(.config文件與我們的板子並不是完全匹配),這時我們可以選擇直接修改.config文件然後執行make menuconfig命令讀取新的選項。但是壹般我們不采取這個方案,我們選擇在配置界面中通過空格、esc、回車選擇某些選項選中或者不選中,最後保存退出的時候,Linux內核會把新的選項(正確的參考答案)更新到.config中,此時我們可以把.config重命名為其它文件保存起來(當妳執行make distclean時系統會把.config文件刪除),以後我們再配置內核時就不需要再去arch/arm/configs下考取相應的文件了,省去了重新配置的麻煩,直接將保存的.config文件復制為.config即可.

5)經過以上兩步,我們可以正確的讀取、配置我們需要的界面了,那麽他們如何跟makefile文件建立編譯關系呢?當妳保存make menuconfig選項時,系統會除了會自動更新.config外,還會將所有的選項以宏的形式保存在Linux內核根目錄下的 include/generated/autoconf.h文件下

內核中的源代碼就都會包含以上.h文件,跟宏的定義情況進行條件編譯。

當我們需要對壹個文件整體選擇如是否編譯時,還需要修改對應的makefile文件,例如:

我們選擇是否要編譯s3c2410_ts.c這個文件時,makefile會根據CONFIG_TOUCHSCREEN_S3C2410來決定是編譯此文件,此宏是在Kconfig文件中定義,當我們配置完成後,會出現在.config及autconf中,至此,我們就完成了整個linux內核的編譯過程。

最後我們會發現,整個linux內核配置過程中,留給用戶的接口其實只有各層Kconfig、makefile文件以及對應的源文件。

比如我們如果想要給內核增加壹個功能,並且通過make menuconfig控制其聲稱過程

首先需要做的工作是:修改對應目錄下的Kconfig文件,按照Kconfig語法增加對應的選項;

其次執行make menuconfig選擇編譯進內核或者不編譯進內核,或者編譯為模塊,.config文件和autoconf.h文件會自動生成;

最後修改對應目錄下的makefile文件完成編譯選項的添加;

最後的最後執行make命令進行編譯。

Kconfig和Makefile

Linux內核源碼樹的每個目錄下都有兩個文檔Kconfig和Makefile。分布到各目錄的Kconfig構成了壹個分布式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文檔相關的內核配置菜單。在執行內核配置make menuconfig時,從Kconfig中讀出菜單,用戶選擇後保存到.config的內核配置文檔中。在內核編譯時,主Makefile調用這 個.config,就知道了用戶的選擇。這個內容說明了,Kconfig就是對應著內核的每級配置菜單。

假如要想添加新的驅動到內核的源碼中,要修改Kconfig,這樣就能夠選擇這個驅動,假如想使這個驅動被編譯,則要修改Makefile。添加新 的驅動時需要修改的文檔有兩種(如果添加的只是文件,則只需修改當前層Kconfig和Makefile文件;如果添加的是目錄,則需修改當前層和目錄下 的***壹對Kconfig和Makefile)Kconfig和Makefile。要想知道怎麽修改這兩種文檔,就要知道兩種文檔的語法結構,Kconfig的語法參見參考文獻《linux-2.6.31kbuild》。

Makefile 文件包含 5 部分:

Makefile 頂層的 Makefile

.config 內核配置文件

arch/$(ARCH)/Makefile 體系結構 Makefile

scripts/Makefile.* 適用於所有 kbuild Makefile 的通用規則等

kbuild Makefiles 大約有 500 個這樣的文件

頂層 Makefile 讀取內核配置操作產生的.config 文件,頂層 Makefile 構建兩個主要的目標:vmlinux(內核映像)和 modules(所有模塊文件)。它通過遞歸訪問內核源碼樹下的子目錄來構建這些目標。訪問哪些子目錄取決於內核配置。頂層 Makefile 包含壹個體系結構 Makefile,由 arch/$(ARCH)/Makefile 指定。體系結構 Makefile 文件為頂層 Makefile 提供了特定體系結構的信息。每個子目錄各有壹個 kbuild文件和Makefile 文件來執行從上層傳遞下來的命令。kbuild和Makefile文件利用.config 文件中的信息來構造由 kbuild 構建內建或者模塊對象使用的各種文件列表。scripts/Makefile.*包含所有的定義/規則,等等。這些信息用於使用 kbuild和 Makefile 文件來構建內核。Makefile的語法參見參考文獻《linux-2.6.31kbuild》。

參考文獻

linux-2.6.31內核編譯指南.pdf

linux-2.6.31kbuild.pdf

Linker script in Linux.pdf

linux內核的配置機制及其編譯過程

Linux內核編譯過程詳解

Linux Kconfig及Makefile學習

  • 上一篇:PB動態報表的實現
  • 下一篇:網絡教育專升本需要考什麽?
  • copyright 2024編程學習大全網