移植linux-2.6.30.4
所用的工具:
交叉编译链
制作yaffs文件的工具
生成uImage的工具(放到交叉编译链的目录下,并且加上相应的前缀,比如arm-linux-mkimage或者arm-none-linux-gnueabi-mkimage)
都是下载自天嵌的论坛,网址如下:
http://bbs.embedsky.net/viewthread.php?tid=630&extra=page%3D1
其中的移植文档也很精彩
下载源码,解压
地址:ftp://ftp.kernel.org/pub/linux/kernel/v2.6
1.
进到 内 核 源 码 , 修 改 “ Makefile” 文件
ARCH = arm
#CROSS_COMPILE = /home/yhf/crosstools/embedSky-EABI/opt/4.3.3/bin/arm-none-linux-gnueabi-
CROSS_COMPILE = /home/yhf/crosstools/embedSky-EABI/opt/crosstools_3.4.5_softfloat/gcc-3.4.5-
glibc-2.3.6/arm-linux/bin/arm-linux-
由于用EABI的交叉编译链总是出错,所以还是用的以前的版本
此交叉编译链的下载地址
http://bbs.embedsky.net/viewthread.php?tid=630&extra=page%3D1
里面有两个编译链,此处选用不支持EABI的那种
注意:
交叉编译链的一致性,也就是编译内核和制作文件系统(编译busybox时用的)所有的应该是同一个交叉编译链
2.
配置内核,选用一个相似的配置,然后就行修改,此处用s3c2410_defconfig,把它拷到linux-2.6.30.4目录下为.config文件。
.config是当配置的时候调用的文件
yhf@yhf-desktop:~/linux-2.6.30.4$ cp arch/arm/configs/s3c2410_defconfig .config
3.
make menuconfig
System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410
[ ] IPAQ H1940
[ ] Acer N30
[ ] Simtec Electronics BAST (EB2410ITX)
[ ] NexVision OTOM Board
[ ] AML M5900 Series
[ ] Thorcom VR1000
[ ] QT2410
选择是否支持 EABI
然后对是否支持 EABI 进行选择,配置如下:(不选择)
因为现在用的是3.4.5的gcc,不支持EABI,所以不选择
Kernel Features --->
Memory split (3G/1G user/kernel split) --->
[ ] Preemptible Kernel (EXPERIMENTAL)
[ ] Use the ARM EABI to compile the kernel
[ ] Allow old ABI binaries to run with this kernel (EXPERIMENTAL)
[ ] High Memory Support (EXPERIMENTAL)
Memory model (Flat Memory) --->
[ ] Add LRU list to track non-evictable pages
(4096) Low address space to protect from user allocation
启动参数
Boot options --->
(0x0) Compressed ROM boot loader base address │ │
(0x0) Compressed ROM boot loader BSS address │ │
│ │
(noinitrd console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=y│ │
│ │
│ │ [ ] Kernel Execute-In-Place from ROM │ │
[ ] Kexec system call (EXPERIMENTAL)
│ │
参数如下:
noinitrd console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=cramfs mem=32M
注意:
启动参数的一致性,此处应该和uboot中的bootargs一致,可以在启动uboot后设置环境变量,也可以编译
uboot的时候,修改配置文件(include/configs/my2410.h)
#define CONFIG_BOOTARGS "noinitrd console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=cramfs mem=32M"
文件系统对yaffs 的支持
Yaffs 文件系统 对 Nand Flash 的支持会更好,此处选上对这个FS的支持
File System --->
Miscellaneous filesystems ---> ]
<*> YAFFS2 file system support │ │
│ │ -*- 512 byte / page devices │ │
│ │ [ ] Use older-style on-NAND data format with pageStatus byt│ │
│ │ [ ] Lets Yaffs do its own ECC │ │
│ │ -*- 2048 byte (or larger) / page devices │ │
│ │ [*] Autoselect yaffs2 format │ │
│ │ [ ] Disable YAFFS from doing ECC on tags by default │ │
│ │ [ ] Disable lazy loading
至此,配置完成,保存退出
/**********************************************************************/
4.
关于机器码的问题
uboot中机器码是 SMDK2410 193
board/samsung/my2410/my2410.c
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410
include/asm-arm/mach-types.h
#define MACH_TYPE_SMDK2410 193
kernel 中如下
gedit arch/arm/mach-s3c2410/mach-smdk2410.c
MACHINE_START(SMDK2410, "SMDK2410")
gedit arch/arm/tools/mach-types
smdk2410 ARCH_SMDK2410 SMDK2410 193
两个都是193 ,是相同的
但是当用 zImage 时还出现下面的错误
error unrecognized/unsupported machine ID
所以修改如下:
在ENTRY(stext)下添加如下三行代码
#gedit arch/arm/kernel/head.S
ENTRY(stext)
mov r0, #0
mov r1, #0xc1 //上面的MACH_TYPE值193换成十六进制就是0xc1
ldr r2, =0x30000100
msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
5.
修改MTD 分区
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "BootLoader",
.size = SZ_512K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = 0x80000,
.size = SZ_128K+SZ_64K,
},
[2] = {
.name = "kernel",
.offset = 0xb0000,
.size = SZ_2M,
},
[3] = {
.name = "rootFS",
.offset = 0x2b0000,
.size = SZ_16M,
}
};
/**********************************************************************/
6.
支持Yaffs文件系统
首先到 http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/网站下载一个 yaffs 文件系统的补丁,
打开网页后,点击“Download GNU tarball”下载补丁 cvs-root.tar.gz。
7.
拿到补丁包后,解压补丁,然后打上 yaffs2 的补丁,方法如下:
#tar xvfz cvs-root.tar.gz (解压得到补丁目录 cvs)
#cd cvs/yaffs2/ (进到 yaffs2 的补丁目录下)
#./patch-ker.sh c /linux-2.6.30.4/ (执行补丁脚本,打补丁到内核中)
到这一步就算是把 yaffs 文件系统移植完毕了,下面我们就开始制作 yaffs 文件系统
8.
此时可以编译了,
make zImage
或者
make uImage
会在目录(arch/arm/boot)下生成zImage和uImage
9.
烧写Image
将zImage,uImage 放到nfs 的目录,执行如下命令
nfs 0x30008000 211.87.227.75:/nfsshare/zImage
go 0x30008000
或者
nfs 0x30010000 211.87.227.75:/nfsshare/uImage
bootm 0x30010000
即可启动kernel
此处可能出现的错误
Uncompressing Kernel Image ... Error: inflate() returned -3
GUNZIP: uncompress, out-of-mem or overwrite error
这时,应该把映像下载到一个更高的地址
TFTP error: 'Permission denied' (0)
此时修改加载文件(uImage.bin)的权限为777即可
/**********************************************************************/
下一步就是做根文件系统了