[轉(zhuǎn)]Linux 2.6.37.1內(nèi)核的交叉編譯 收藏
Linux 2.6.37.1內(nèi)核的交叉編譯
轉(zhuǎn)自
本文主要介紹適合ARM 處理器S3C2440目標(biāo)板的最新版本linux 內(nèi)核 linux-2.6.37.1的交叉編譯。環(huán)境為:Fedora14,編譯器arm-linux-4.3.2
1、linux內(nèi)核的編譯過(guò)程
首先必須獲得最新版本的內(nèi)核,可以在
ftp.kernel.org上下載我們需要的2.6.37.1版本的內(nèi)核。獲得相應(yīng)內(nèi)核包后,解壓:
對(duì)于 Linux-2.6.37.1.tar.gz為
tar zxvf Linux-2.6.37.1.tar.gz
對(duì)于 Linux-2.6.37.1.tar.bz2為
tar xjvf Linux-2.6.37.1.tar.bz2
之后進(jìn)入Linux-2.6.37.1文件夾內(nèi)。:
cd linux-2.6.37.1
準(zhǔn)備工作結(jié)束后,我們開始配置內(nèi)核。在本機(jī)編譯內(nèi)核時(shí),我們可以直接make menuconfig之類,就可根據(jù)我們機(jī)器當(dāng)前內(nèi)核的配置生產(chǎn).config文件。但對(duì)于嵌入式當(dāng)然就很困難。幸虧Linux支持上百種平臺(tái)。對(duì)于不同平臺(tái)都有默認(rèn)的配置文件,對(duì)于我們使用的arm,可以在/arch/arm/configs文件夾下看到,我們要根據(jù)自己所使用的平臺(tái)來(lái)選擇。如S3C2440目標(biāo)板,可以選擇s3c2410_defconfig。之后只要運(yùn)行
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
對(duì)于我們使用的兩個(gè)宏ARCH和CROSS_COMPILE,分別是指我們選擇的體系結(jié)構(gòu)(Linux在內(nèi)核代碼樹arch文件夾中列出支持的體系結(jié)構(gòu))和交叉編譯器的前綴。(當(dāng)然也可以直接修改Makefile中ARCH和CROSS_COMPILE參數(shù))。
這里我們通過(guò)配置界面中“Load an Alternate Configuration File”加載/arch/arm/configs/s3c2410_defconfig
然后我們根據(jù)平臺(tái)的特性進(jìn)行相應(yīng)的配置,配置完畢保存成默認(rèn)配置(.config)。
之后就是編譯了,對(duì)于嵌入式大多是編譯成鏡像文件,這里編譯成zImage
make ARCH=arm CROSS_COMPILE=arm-linux-
一般而言編譯好的鏡像文件zImage是在 Linux-2.6.26/arch/$ARCH/boot里,本次當(dāng)然是在 Linux-2.6.26/arch/arm/boot找到他了,一看居然有1.7兆這么大。怎么變小呢?關(guān)鍵就是在make menucnfig階段了,這階段才是技術(shù)要求所在。
2 、編譯適應(yīng)S3C2440目標(biāo)板的linux內(nèi)核
1)、首先linux啟動(dòng)過(guò)程中需要校驗(yàn)machine ID,因此我們修改linux內(nèi)核的文件arch\arm\tools\mach-types中:
s3c2440 ARCH_S3C2440 S3C2440 1008 //1008,與uboot中一致
說(shuō)明:不建議直接修改arch/arm/kernel/head.S文件通過(guò)R1寄存器直接傳遞machine ID給內(nèi)核。
修改內(nèi)核文件arch/arm/plat-s3c24xx/common-smdk.c文件中Nand Flash分區(qū)。這里只創(chuàng)建四個(gè)分區(qū),其他多余的分區(qū)屏蔽掉(這里的分區(qū)需要和u-boot中的分區(qū)信息一致)
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = 0x30000,
.offset = 0,
},
[1] = {
.name = "params",
.offset = 0x30000,
.size = 0x10000,
},
[2] = {
.name = "kernel",
.offset = 0x50000,
.size = SZ_2M,
},
[3] = {
.name = "root",
.offset = 0x250000,
.size = (0x4000000-0x2500000),
},
};
2)、配置內(nèi)核模塊的功能,有幾種方式可以進(jìn)行界面選擇:
make menuconfig(文本選單的配置方式,在有字符終端下才能使用)
make xconfig(圖形窗口模式的配置方式,圖形窗口的配置比較直觀,必須支持Xwindow下才能使用)
make oldconfig(文本配置方式,在原內(nèi)核配置的基礎(chǔ)修改時(shí)使用)
這里使用make menuconfig命令。
1> [*]Enable loadable module support--->
[*]Forced module loading
[*]Module unloading
2> System Type--->
S3C2410 Machines--->
[*]SMDK2410/A9M2410選上 其余不選
S3C2440 Machines--->
[*]SMDK2440
[*]SMDK2440 with S3C2440 CPU module,其余不選
其余的Machines下選項(xiàng)全部不選(如2400,2412,2442,2443)
3> Kernel Features--->
[*]Use the ARM EABI to compile the kernel
注:如果所使用的的交叉編譯arm-linux-gcc-4.3.2是符合EABI標(biāo)準(zhǔn)交叉編譯器,對(duì)于浮點(diǎn)運(yùn)行會(huì)預(yù)設(shè)硬浮點(diǎn)運(yùn)算FPA(Float Point Architecture),而沒有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,會(huì)使用FPE(Float Point Emulation 即軟浮點(diǎn)),這樣在速度上就會(huì)遇到極大的限制,使用EABI(Embedded Application Binary Interface)則可以對(duì)此改善處理,ARM EABI有許多革新之處,其中最突出的改進(jìn)就是Float Point Performance,它使用Vector Float Point(矢量浮點(diǎn)),因此可以極大提高涉及到浮點(diǎn)運(yùn)算的程序。
4> Boot options-
noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
5> Userspace binary formats--->
[*]Kernel support for ELF binaries
其它的可以全部不選。
6> 選擇支持yaffs2文件系統(tǒng)
Filesystem--->
Miscellaneous filesystems--->
<*>YAFFS2 file system support
[*] Lets Yaffs do its own ECC
Native language support
<*> Codepage 437 (United States,Canada)
<*>Simplified Chinese charset(GB2312)
<*>Traditional Chinese charset(Big5)
<*>NLS ISO 8859-1(Latin1:Western European Languages)
<*>NLS UTF-8
配置完成以后,我們就可以通過(guò)make ARCH=arm CROSS_COMPILE=arm-linux- 命令生成我們需要的zImage鏡像文件了,然后再通過(guò)mkimage工具生成可以由u-boot直接引導(dǎo)的uImage鏡像文件了。
說(shuō)明:原始的linux內(nèi)核是不支持Yaffs2文件系統(tǒng)的,關(guān)于文件系統(tǒng)的支持和制作參見本博其他文章。