分类: LINUX
2009-05-22 18:59:50
宿主机:
Fedora 9 (linux-
gcc-
目标机:s
交叉编译器:arm-linux-gcc-
要移植的内核版本:linux-
文件系统:cramfs
目的:本来开发板上到内核是
准备知识:
Linux支持多种平台架构。在其源码的arch目录下,已经将各种支持的平台架构的源码分门别类。为了配置方便,在各种平台架构的目录下,一般都配有一个名为configs的目录。其中,放置着许多已经初步配置好的defconfig文件。通过这些defconfig文件,加快了我们配置内核的速度。比如我所用的是一个arm架构的s
#make s |
或
#cp arch/arm/configs/s |
执行上述命令后,将会在源码目录下生成相应的.config配置文件。通过
#make menuconfig |
或
#make xconfig |
可以进一步配置内核。最后执行
#make zImage |
生成我们所需的烧录文件。
内核编译基本命令:
make mrproper --- 清理全部文件,包括.config和一些备份文件
make clean --- 清理生成文件,但会保留.config和一些模块文件
make defconfig --- 生成包含全部默认选项的.config文件。这里用make s
make oldconfig --- 在旧的.config基础上生成新的.config。如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦
make config --- 基于文本的最为传统的配置界面,不推荐使用
make menuconfig --- 基于文本选单的配置界面,字符终端下推荐使用
make xconfig --- 基于图形窗口模式的配置界面,Xwindow下推荐使用
目 的都是生成一个.config文件,这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,你就用这个好了,这个比较方便,也好设置。如果你不能使用Xwindow,那么就使用 make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。 |
make --- 默认编译
make bzImage --- 编译生成压缩的内核二进制文件,也会用make zImage替代
移植linux-
1. 解压源代码
我将已下载的linux-
#cd /usr/local/arm #tar zxvf linux- #cd linux- |
2. 更改Makefile
#ARCH ?= $(SUBARCH) #CROSS_COMPILE ?= ARCH ?= arm CROSS_COMPILE ?= arm-linux- 或者:CROSS_COMPILE ?= /usr/local/arm/ 我是将交叉编译器安装在/usr/local/arm目录下的。 |
3. 生成默认配置
#make s |
执行后,在终端打印出如下信息:
[root@localhost linux- HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC scripts/basic/hash HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/kxgettext.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/lex.zconf.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf # # configuration written to .config # [root@localhost linux- |
4. 增加devfs文件系统支持linux
找到menu "Pseudo filesystems"
添加如下语句:
config DEVFS_FS bool "/dev file system support (OBSOLETE)" default y config DEVFS_MOUNT bool "Automatically mount at boot" default y depends on DEVFS_FS |
5. 修改晶振( 可解决打印信息乱码问题 )
文件:arch/arm/mach-s
/*s s |
6. 添加sdi设备,&s
文件:arch/arm/mach-s
static struct platform_device *smdk2440_devices[] __initdata = { &s &s &s &s &s &s }; |
7. 修改MTD分区
文件: arch/arm/plat-s
需要和bootloader中的分区信息相同,否则,启动时出错。
static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "Boot", .size = 0x00030000, .offset = 0 }, [1] = { .name = "MyApp", .size = 0x00100000, .offset = 0x00030000, }, [2] = { .name = "Kernel", .size = 0x002d0000, .offset = 0x00130000, }, [3] = { .name = "fs_cramfs_ .size = 0x01400000, // .offset = 0x00400000, }, [4] = { .name = "fs_yaffs_ .size = 0x02600000, // .offset = 0x01800000, }, [5] = { .name = "WINCE_ .size = 0x00200000, .offset = 0x03e00000, } }; |
8. 关闭ECC校验
文件:drivers/mtd/nand/s
函数:s
/*chip->ecc.mode = NAND_ECC_SOFT; */ chip->ecc.mode = NAND_ECC_NONE; |
9. 配置内核
#make xconfig |
终端中打印出:
[root@localhost linux- HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC scripts/basic/hash HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/kxgettext.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/lex.zconf.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf # # configuration written to .config # [root@localhost linux- CHECK qt sed < scripts/kconfig/lkc_proto.h > scripts/kconfig/lkc_defs.h 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' HOSTCC scripts/kconfig/kconfig_load.o /usr/lib/qt-3.3/bin/moc -i scripts/kconfig/qconf.h -o scripts/kconfig/qconf.moc HOSTCXX scripts/kconfig/qconf.o HOSTLD scripts/kconfig/qconf scripts/kconfig/qconf arch/arm/Kconfig |
然后弹出配置界面:
其中有几项一定要修改的,分别是:
a. 启动
|---Boot options| |---Default kernel command string: [root=/dev/mtdblock3 rootfstype=cramfs init=/linuxrc console=ttySAC0,115200 devfs=mount mem=64] |
分析:
/dev/mtdblock3 : 表示MTD分区的第3个分区存储根文件系统
rootfstype=cramfs : 分区是cramfs类型,这项不加应该关系不大
init=/linuxrc : 启动的首个脚本即根目录下的linuxrc
console=ttySAC0,115200 : 使用串口1作为串口调试,波特率设置为115200; 现在已经摒弃了以前使用ttyS0的写法
devfs=
mem=64 : 存储器大小为
b. 增加devfs文件系统支持
|
这几项都是必选的
c. 芯片及系统类型
支持2440时,这一项也是必选的,否则会编译不过
d. DMA Engine support
需要将此项选择,否则编译会出错。
e. MMC/SD/SDIO card support
选中此项进行对MMC/SD/SDIO的支持
f. 去掉Ethernet (1000 Mbit)和Ethernet (10000 Mbit)
也可不去,为了压缩内核大小,我去掉了这两项。