http://www.cnblogs.com/jeffkuang/articles/3774911.html
2014
目標(biāo)機(jī):友善之臂 QQ2440開發(fā)板
交叉編譯器:arm-linux-3.4.1
二. 移植linux-2.6.32.2內(nèi)核到QQ2440開發(fā)板
1.獲得內(nèi)核: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz2
2.解壓內(nèi)核: tar –jxvf linux-2.6.32.2.tar.bz2
3.修改參數(shù):
3.1 進(jìn)入內(nèi)核目錄,修改makefile
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
然后執(zhí)行如下的命令,使用arch/arm/configs/s3c2410_defconfig文件來配置內(nèi)核,它生成.config配置文件,以后就可以直接使用”make menuconfig”修改配置了。
make s3c2410_defconfig
最后是編譯生成內(nèi)核,執(zhí)行”make”命令將在頂層目錄下生成內(nèi)核映像文件vmlinux;執(zhí)行”make uImage”除生成vmlinux外,還在arch/arm/boot目錄下生成U-Boot格式的內(nèi)核映像文件uImage;執(zhí)行”make zImage”除生成vmlinux外,還在arch/arm/boot目錄下生成vivi引導(dǎo)的內(nèi)核映像文件zImage。
3.2 修改平臺(tái)輸入時(shí)鐘由于QQ2440板子 系統(tǒng)時(shí)鐘源為 12M 無源晶振
找到內(nèi)核源碼arch/arm/mach-s3c2440/mach-smdk2440.c文件,
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);//原來是16934400
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3.3 修改MTD分區(qū)信息
修改文件arch/arm/plat-s3c24xx/common-smdk.c。
第一,修改分區(qū)信息(64M):
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.offset = 0x00000000,
.size = 0x00030000,
},
[1] = {
.name = "kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00250000,
.size = 0x03dac000,
}
};
3.4 修改S3C2440 的機(jī)器號(hào)
由于Bootloader 傳遞給Linux 內(nèi)核的機(jī)器號(hào)為782(根據(jù)實(shí)際的情況)
修改 arch/arm/tools/mach-types 文件
s3c2440 ARCH_S3C2440 S3C2440 782
3.5 給內(nèi)核打yaffs2文件系統(tǒng)的補(bǔ)丁
從http:/www.aleph1.co.uk/cgi-bin/viewcvs.cgi/獲取源代碼文件cvs-root.tar,解壓源碼目錄并進(jìn)入目錄
cd /…/…/cvs/yaffs2
./patch-ker.sh c /
上面命令完成下面三件事情:
(1) 修改內(nèi)核fs/Kconfig
增加一行:source "fs/yaffs2/Kconfig"
(2) 修改內(nèi)核fs/Kconfig
增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3) 在內(nèi)核fs/目錄下創(chuàng)建yaffs2 目錄
將yaffs2 源碼目錄下面的Makefile.kernel 文件復(fù)制為fs/yaffs2/Makefie;
將yaffs2 源碼目錄的Kconfig 文件復(fù)制到內(nèi)核fs/yaffs2 目錄下;
將yaffs2 源碼目錄下的*.c *.h 文件復(fù)制到內(nèi)核fs/yaffs2 目錄下.
3.6 內(nèi)核配置
1> 進(jìn)入Linux-2.6.32.2內(nèi)核主目錄,通過以下命令將2410的默認(rèn)配置文件寫到當(dāng)前目錄下的.config。S3C2410的配置和S3C2440差不多,,在這基礎(chǔ)上進(jìn)行修改。
make s3c2410_defconfig (也可以上面就做)
2> 配置內(nèi)核模塊的功能,有幾種方式可以進(jìn)行界面選擇:
make menuconfig(文本選單的配置方式,在有字符終端下才能使用)
make xconfig(圖形窗口模式的配置方式,圖形窗口的配置比較直觀,必須支持Xwindow下才能使用)
make oldconfig(文本配置方式,在原內(nèi)核配置的基礎(chǔ)修改時(shí)使用)
這里使用make menuconfig命令。
3> [*]Enable loadable module support--->
[*]Forced module loading
[*]Module unloading
4> System Type--->
S3C2410 Machines--->
[*]SMDK2410/A9M2410選上 其余不選
S3C2440 Machines--->
[*]SMDK2440
[*]SMDK2440 with S3C2440 CPU module,其余不選
其余的Machines下選項(xiàng)全部不選(如2400,2412,2442,2443)
5> 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)算的程序。
6> Boot options-?
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
7> Userspace binary formats--->
[*]Kernel support for ELF binaries
其它的可以全部不選。
8> 選擇支持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
配置完成以后,我們就可以通過以上的命令生成我們需要的uImage或者zImage鏡像文件了,然后通過uboot或者supervivi燒寫內(nèi)核。我們通過supervivi的USB工具下載的內(nèi)核啟動(dòng)情況如下:
Copy linux kernel from 0x00050000 to 0x30008000, size = 0x00200000 ... done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySA
C0"
MACH_TYPE = 782
NOW, Booting Linux......
Uncompressing Linux.............................................................
....................................... done, booting the kernel.
Linux version 2.6.32.2 (root@localhost.localdomain) (gcc version 3.4.1) #1 Fri M
ay 7 16:57:01 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
Machine: SMDK2440
。。。。。。。。。
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
從以上的啟動(dòng)信息可知還需要文件系統(tǒng)才能啟動(dòng)。
下一步我們將建立yaffs根文件系統(tǒng)。
前一篇文章我們已將Linux-2.6.32.2的內(nèi)核移植好了,當(dāng)然了驅(qū)動(dòng)我們還沒有添加上去,今天我們先建立一個(gè)yaffs文件系統(tǒng),待我們的內(nèi)核能夠掛載我們的文件系統(tǒng)以后,我們?cè)偃ミM(jìn)一步的完善內(nèi)核,這樣,嵌入式linux系統(tǒng)就算是構(gòu)建成功了。
1、 下載busybox
在home/kele888目錄下建立rootfs文件夾,并把busybox壓縮文件解壓到home/kele888目錄下我下載的是busybox-1.13.0的版本。
[root@localhost kele888]# ls
busybox-1.13.0 ....
[root@localhost kele888]#
2、 進(jìn)入busybox目錄開始編譯
修改Makefile文件
# vim Makefile
164行 CROSS_COMPILE ?= arm-linux-
190行 ARCH ?= arm
保存推出
配置busybox
# make menuconfig(可以根據(jù)需要適當(dāng)選擇,改一下其他默認(rèn)就行了)
BusyBox Settings --->
Build Options ---> (采用靜態(tài)編譯)
[*] Build BusyBox as a static binary (no shared libs)
Install optin-->
[*] Don't use /usr //可以不選,選了則沒有/usr文件夾
Busybox Library Tuning --->
(2) MD5: Trade Bytes for Speed
[*] Faster /proc scanning code (+100 bytes)
[*] Support for /etc/networks
[*] Command line editing
[*] Additional editing keys
[*] vi-style line editing commands
[*] History saving
[*] Tab completion
[*] Username completion
[*] Fancy shell prompts
Linux Module Utilities --->
[ ] Support version 2.2.x to 2.4.x Linux kernels
[*] Support version 2.6.x Linux kernels
Linux System Utilities --->
[*] Support for the old /etc/mtab file
Miscellaneous Utilities --->
[*] devfs(obsolete)
[*] Use devfs names for all device(obsolete)
Shell --->
Choose your default shell(ash)-->
---ash
編譯安裝busybox
make CONFIG_PREFIX=/home/kele888/rootfs install
注:編譯“networking/interface.c”文件時(shí)可能會(huì)出現(xiàn)以下錯(cuò)誤:
CC networking/interface.o
networking/interface.c:818: error: 'ARPHRD_INFINIBAND' undeclared here (not in a function)
make[1]: *** [networking/interface.o] Error 1
make: *** [networking] Error 2
通過查看內(nèi)核源代碼目錄中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值為“32”,然后修改“networking/interface.c”文件,在其中添加:
#define ARPHRD_INFINIBAND 32
完成以后將會(huì)在rootfs文件下生成如下的文件:
bin linuxrc sbin usr
修改_install/bin/busybox 的屬性。為+x
chmod +x ./_install/bin/busybox
必須要修改屬性,否則在busybox 中很多命令會(huì)受限
然后在rootfs中建立其它目錄
mkdir dev etc home lib mnt proc sys tmp root var
下面我們看一下由busybox生成以及自己mkdir的文件里面的一些內(nèi)容(當(dāng)然有些是不必要的):
“dev”目錄
下面的內(nèi)容在內(nèi)核掛載完畢文件系統(tǒng)后,系統(tǒng)會(huì)使用mdev 自動(dòng)建立。
不過mdev 是調(diào)用init 進(jìn)程來啟動(dòng)的,在使用mdev 構(gòu)建“dev”目錄前,init 進(jìn)程需要用到“/dev/console”和“/dev/null”這兩個(gè)設(shè)備文件,所以,我們需要在制作文件系統(tǒng)時(shí)靜態(tài)創(chuàng)建這兩個(gè)設(shè)備文件,方法如下:
#mknod console c 5 1
#mknod null c 1 3
如果不創(chuàng)建這兩個(gè)設(shè)備文件,在文件系統(tǒng)啟動(dòng)時(shí)會(huì)出現(xiàn)錯(cuò)誤信息.大概是不能初始化控制臺(tái)。
“etc”目錄
用來存放系統(tǒng)的配置文件。
在“etc”目錄下面有如下常用的文件:
fstab:指明需要掛載的文件系統(tǒng);
group:用戶組;
inittab:init 進(jìn)程的配置文件;
passwd:密碼文件;
profile:用戶環(huán)境配置文件;
mdev.conf:因?yàn)?.6.18 版本開始linux 放棄使用devfs 而采用udev(mdev 是udev 的簡化版本),這里的
mdev.conf 文件可以是空,也可以按照一定規(guī)則來編寫,這里我采用了為空;
resolv.conf:存放DNS 信息的文件,訪問外網(wǎng)時(shí)需要DNS 的信息。
常用的目錄有:
init.d 目錄:啟動(dòng)文件目錄,該目錄下面有個(gè)“rcS”的文件,里面存放了系統(tǒng)啟動(dòng)時(shí)配置以及自啟動(dòng)加載
的進(jìn)程等;
sysconfig 目錄:在我們的文件系統(tǒng)里面,該目錄下面存放了名為“HOSTNAME”的文件,該文件內(nèi)容為:
Kele,這句話就是我們?cè)谖募到y(tǒng)里面看到那個(gè)“[root@ Kele/]” rc.d 目錄:在我們的文件系統(tǒng)里面用來存放一些自啟動(dòng)所要調(diào)用的腳步等;
-----------------------/lib文件--------------------------------
/lib的庫其實(shí)就是進(jìn)行busybox編譯的庫,即交叉編譯器的庫,我們這里使用的是3.4.1(位置/usr/local/arm/3.4.1)。
# cd /usr/local/arm/3.4.1/arm-linux/lib
# for file in libc libcrypt libdl libm libpthread libresolv libutil
> do
> cp $file-*.so rootfs/lib (復(fù)制到你做的文件系統(tǒng)的/lib目錄下)
> cp -d $file.so.[*0-9] rootfs/lib
> done
# cp -d ld*.so* rootfs/lib
-----------------系統(tǒng)配置文件的建立---------------------
--========/etc目錄============
(1) fstab文件
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
(2)inittab文件
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
(3)創(chuàng)建/etc/init.d文件夾和rcS,在rcS中添加
#!/bin/sh
ifconfig eth0 192.168.1.17
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
(4)host文件
Kele
(5)創(chuàng)建mdev.conf文件 (空文件)
(6)復(fù)制主機(jī)/etc/下面的文件passwd, group, shadow 文件到/etc
# cp /etc/group .
# cp /etc/passwd .
# cp /etc/shadow .
修改passwd中用戶使用的shell名稱。FC6上默認(rèn)的為bash,而vivi只支持ash。
root:x:0:0:root:/root:/bin/bash -->root:x:0:0:root:/root:/bin/ash
(7)修改各文件和文件夾的權(quán)限
# chmod 755 /rootfs/etc/init.d/rcS
# chmod 755 /rootfs/etc/host
聯(lián)系客服