移植 kernel linux-2.6.30.4

移植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即可
/**********************************************************************/

下一步就是做根文件系统了

你可能感兴趣的:(image,System,download,makefile,Allocation,filesystems)