Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1043554
  • 博文数量: 244
  • 博客积分: 6820
  • 博客等级: 准将
  • 技术积分: 3020
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 21:33
文章分类

全部博文(244)

文章存档

2013年(1)

2012年(16)

2011年(132)

2010年(3)

2009年(12)

2008年(80)

我的朋友

分类: LINUX

2008-09-09 23:56:18

 
 
 
 
 
 
 
 
 
 
 
 
bootloader编译环境:
vivi版本:0.1.4
交叉编译器(CROSS-COMPILE)版本:2.95.3
 (下载地址略:网上很多搜下。)
操作系统:Fedora  7
======================================
linux内核编译环境:
内核版本:linux2.6.22.1
交叉编译器(CROSS-COMPILE)版本: 4.2.0
(下载地址:
  )
  注意:下载选项,要选 ARM EABI 的选项,和 IA32 GNU/linux
操作系统: Fedora  7
======================================
文件系统编译环境:
busybox1.5.1,或1.4.2
交叉编译器(CROSS-COMPILE)版本: 3.3.2
(下载地址: )
操作系统: Fedora  7
----------------------------------------------
硬件:
    板子是北京恒颐高科技术有限公司的H2410EB
    内存:     64MB SDRAM(2×16M×16位);
    CPU:      S3C2410 ARM处理器,
    Nor Flash:2MB的Nor Flash,用于固化测试程序(用来下载bootloader,内核,或文件系统);
    NANDflash: 64MB的Nand Flash,用于存储Bootloader、Linux内核及文件系统、应用程序和数据;
++++++++++++++++++++++++++++++++++++++++++++++

 

 

==================================================================================================
     一: 编译环境搭建
==================================================================================================
一:搭建交叉编译环境
说明:由于编译交叉编译环境比较繁琐,建议大家用已经编译好的交叉编译环境。
下面以3.3.2的交叉编译环境的搭建为例,其他的两个的编译器环境搭建一样。

1. 解压文件命令:
        tar  jxvf   obsolete-gcc-3.3.2.tar.bz2
       (obsolete-gcc-3.3.2.tar.bz2下载地址: )

2. 把解压的文件夹中的 “3.3.2”文件夹拷贝到 /usr/local/arm目录下
       (如果没有arm目录就新建arm目录,但是一定要是拷贝到这个目录,不然不能运行)。

3. 在命令窗口输入
        export PATH=/usr/local/arm/3.3.2/bin:$PATH

4. 如果输入 arm- 然后按下tab键能自动补全命令 arm-linux- 说明搭建成功。

 

 

===================================================================================================
      二:     bootloader 编译
===================================================================================================

二:   bootloader的修改

主要修改分区信息,如果要能下载yaffs文件系统还得另外打补丁,最近我会写编这样的文章。
具体修改:

1.     解压vivi(具体命令略,如果你解压都不会,移植可能对你来说有点困难)
       [root@localhost vivi]# ls
       arch     CVS            drivers  init  Makefile         Rules.make  test  vivi      vivi.map
       COPYING  Documentation  include  lib   Makefile.newSDK  scrīpts     util  vivi-elf

2.     [root@localhost vivi]# vim ./arch/s3c2410/smdk.c
 修改 NAND flash 分区如下:
 ----------------------------------------------------------------------
 mtd_partition_t default_mtd_partitions[] = {
        {
                name:           "bootloader",
                offset:         0,
                size:           0x00020000,
                flag:           0
        }, {
                name:           "param",
                offset:         0x00020000,
                size:           0x000E0000,
                flag:           0
        }, {
                name:           "kernel",
                offset:         0x00100000,
                size:           0x00300000,
                flag:           0
        }, {
                name:           "root",
                offset:         0x00400000,
                size:           0x01400000,
                flag:           MF_BONFS
        }, {
                name:           "user",
                offset:         0x01800000,
                size:           0x02C00000,
                flag:           MF_BONFS
        }
 };
 -------------------------------------------------------------------------

3. 修改Makefile
 [root@localhost vivi]# vim Makefile
 修改  ARCH    LINUX_INCLUDE_DIR   CROSS_COMPILE 如下:
 ------------------------------------------------------------------------
 
 ARCH := arm
 
 LINUX_INCLUDE_DIR       = /usr/local/arm/2.95.3/include/
 
 CROSS_COMPILE   = /usr/local/arm/2.95.3/bin/arm-linux-

3. 编译
 [root@localhost vivi]# make

 ------------------------------------------------------------------------
 会在 vivi目录生成你要的 vivi 程序(bootloader)
 ------------------------------------------------------------------------
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 说明:我的nand falsh的一块为16k,
 所以上面的分区:

 **************************************
  分区信息
 **************************************
 bootloader:  128k
 param     :  896k
 kernel    :  3M
 root      :  20M
 user      :  40M

 **************************************
  bon 操作
 **************************************
 bon part 0 1M 4M:m 24M:m

 解释一下上面的命令:
        第1个分区从0开始;
        第2个分区从0x30000(即192K)开始;
        第3个分区从0x200000(即2M)开始;
        第4个分区从0x400000(即4M)开始.
 
 ***********************************
  bon part info
 ***********************************

 bon part info
 BON info. (4 partitions)
 No: offset      size            flags     bad
 ---------------------------------------------
  0: 0x00000000  0x00100000      00000000    0    1M
  1: 0x00100000  0x00300000      00000000    0    3M
  2: 0x00400000  0x01400000      00000001    0   20M
  3: 0x01800000  0x027fc000      00000001    0   39M+1008k

 ***********************************
  part show
 ***********************************
 mtdpart info. (5 partitions)
 name              offset        size        flag
 ------------------------------------------------
 bootloader      : 0x00000000    0x00020000     0  128k
 param           : 0x00020000    0x000e0000     0  896k
 kernel          : 0x00100000    0x00300000     0    3M
 root            : 0x00400000    0x01400000     4   20M
 user            : 0x01800000    0x02c00000     4   44M
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 

===================================================================================================
      三:  内核 编译
===================================================================================================

三: 内核 编译
 
 注意:用的编译器是4.2.0的交叉编译器

1. 修改 Makefile
 [root@localhost porting]# cd linux-2.6.22
 [root@localhost linux-2.6.22]# vim Makefile
 
 修改 ARCH 和 CROSS_COMPILE
 --------------------------------------------------------------
 ARCH            ?= arm
 CROSS_COMPILE   ?=/usr/local/arm/4.2.0/bin/arm-none-eabi-

2. 修改common-smdk.c文件
 [root@localhost linux-2.6.22]# vim arch/arm/plat-s3c24xx/common-smdk.c
 ------------------------------------------------------------------------------
 static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name   = "Boot",
                .size   = SZ_128K,
                .offset = 0,
        },
        [1] = {
                .name   = "param",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_1M - SZ_128K,
        },
        [2] = {
                .name   = "kernel",
                .offset = SZ_1M,
                .size   = SZ_1M * 3,
        },
        [3] = {
                .name   = "root",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_2M * 10,
        },

 /*
      ,
        [5] = {
                .name   = "S3C2410 flash partition 5",
                .offset = SZ_1M * 14,
                .size   = SZ_1M * 10,
        },
        [6] = {
                .name   = "S3C2410 flash partition 6",
                .offset = SZ_1M * 24,
                .size   = SZ_1M * 24,
        },
        [7] = {
                .name   = "S3C2410 flash partition 7",
                .offset = SZ_1M * 48,
                .size   = SZ_16M,
        }
 */

 };
 ---------------------------------------------------------------------------------

3. 去掉nand flash 的ECC
 [root@localhost linux-2.6.22]# vim drivers/mtd/nand/s3c2410.c
 ---------------------------------------------------------------------------------
 1、打开drivers/mtd/nand/s3c2410.c
 2、搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里
 3、修改NAND_ECC_SOFT为NAND_ECC_NONE
 ---------------------------------------------------------------------------------

4. 支持启动时挂载devfs
 为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统。
 [root@localhost linux-2.6.22]# vi fs/Kconfig
 
 -----------------------------------------------------------------------------------
 找到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. 编译内核
 [root@localhost linux-2.6.22]# cp ./arch/arm/configs/s3c2410_defconfig  .config
 [root@localhost linux-2.6.21.5]#  make  xconfig
 
 ----------------------------------------------------------------------------------
 Userspace binary formats
         [ ]Kernel support for a.out and ECOFF binaries (BINFMT_AOUT) (去除该选项)

 Boot options
  Default kernel command string
   改成:
   noinitrd root=/dev/mtdblock3 console=ttySAC0,115200 init=/linuxrc

 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 再选上你想选的选项,如果编译通不过,对照着错误,看下把哪些选项去除,或添加哪些选项。
 -----------------------------------------------------------------------------------

6. 编译
 [root@localhost linux-2.6.22]# make zImage


===================================================================================================
      四:    文件系统的制作
===================================================================================================
 
四: 文件系统的制作
      注意:交叉编译器 3.3.2,   busybox1.5.1,  静态编译
      编译更详细的内容:

1. busybox的编译
 
 -----------------------------------------------------------------------------
 一  修改busybox中的 Makefile文件
 找到  ARCH  和 CROSS_COMPILE 修改成如下
 ARCH            ?= arm
 CROSS_COMPILE   ?= /usr/local/arm/3.3.2/bin/arm-linux-

 二  配置

 [root@localhost busybox-1.4.2]# make defconfig
 [root@localhost busybox-1.4.2]# make xconfig
 =============================================
 修改配置 主要修改如下
 =============================================
 Busybox Settings
     Build Options
   [*]Build BusyBox as a static binary   
      //选此项静态编译。

 Miscellaneous Utilities
     []taskset    //选了就会出错

 -------------------------------------------------
 三  编译
 [root@localhost busybox-1.5.1]# make all install
 -----------------------------------------------------------------
 最后会在  busybox-1.5.1/_install/目录生成你要的 bin sbin  usr 目录
 ------------------------------------------------------------------
 
2. 编写linuxrc 文件
 -----------------------------------------------------------------
 #!/bin/sh
 #echo "mount /etc as ramfs"
 /bin/mount -n -t ramfs ramfs /etc
 /bin/cp -a /mnt/etc/* /etc

 echo "re-create the /etc/mtab entries"
 # re-create the /etc/mtab entries
 /bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3  /

 #mount some file system
 echo "mount  /dev/shm as tmpfs"
 /bin/mount -n -t  tmpfs tmpfs /dev/shm


 #挂载/proc为proc文件系统
 echo "mount /proc as proc"
 /bin/mount -n -t  proc none /proc

 #挂载/sys为sysfs文件系统
 echo "mount  /sys as sysfs" 
 /bin/mount -n -t  sysfs none /sys

 /bin/mount -f -t ramfs ramfs /etc

 echo "yaffs is mounted"
 /bin/mount -t yaffs /dev/mtdblock/1 /mnt/yaffs
 exec /sbin/init
 ---------------------------------------------------------------------
3. 权限修改
 chmod  chmod 775 linuxrc

4.  编写 inittab文件
 
 ---------------------------------------------------------------------
 ::sysinit:/etc/init.d/rc
 
 ::askfirst:-/bin/sh
 tty2::askfirst:-/bin/sh
 tty3::askfirst:-/bin/sh
 tty4::askfirst:-/bin/sh
 tty0::askfirst:-/bin/sh
  
 ::restart:/sbin/init
       
 ::ctrlaltdel:/sbin/reboot
 ::shutdown:/bin/umount -a -r
 ::shutdown:/sbin/swapoff -a
 ----------------------------------------------------------------------

5. rc文件
 ----------------------------------------------------------------------
 #!/bin/sh

 /bin/mount -a
 -----------------------------------------------------------------------

6. fastab 文件
 ----------------------------------------------------------------------
 none  /proc  proc defaults 0 0
 none  /dev/pts devpts mode=0622 0 0
 tmpfs  /dev/shm tmpfs defaults 0 0
 ----------------------------------------------------------------------


7. 各文件的关系
 ----------------------------------------------------------------------
 7.1 建立一个目标板的空根目录
 我们将在这里构建构建根文件系统,创建基础目录结构. 存放交叉编译后生成的目标应用程序
 (BUSYBOX,TINYLOGIN),存放库文件等。
 [root@localhost rootfs]# mkdir my_rootfs
 [root@localhost rootfs]# pwd
 /home/arm/dev_home/rootfs/my_rootfs
 [root@localhost rootfs]# cd my_rootfs
 [root@localhost my_rootfs]#
 7.2 在my_rootfs中建立Linux目录树
 [root@localhost my_rootfs]#mkdir bin dev etc home lib mnt proc sbin sys tmp root usr
 [root@localhost my_rootfs]#mkdir mnt/etc
 [root@localhost my_rootfs]#mkdir usr/bin usr/lib usr/sbin
 [root@localhost my_rootfs]#touch linuxrc
 [root@localhost my_rootfs]#tree
 |bin
 |dev
 |etc
 |home
 |lib
 |linuxrc
 /* 此文件为启动脚本,是一shell脚本文件。本文后面有专门介绍 */
 |mnt
 | `etc  
 |proc
 |sbin
 |sys
 |tmp
 |root
 `usr
 |bin
 |lib
 `sbin

8. 把上面编译出来的 busybox文件拷贝到 my_rootfs 文件系统
 
 ---------------------------------------------------------------
 把 busybox1.5.1/_install/目录下的 bin  sbin  usr 覆盖 my_rootfs
 文件夹里的空文件夹。
 --------------------------------------------------------------

9. 把 5 生成的文件(rc)拷贝到 /mnt/etc/init.d/目录(先在/mnt/etc/目录新建格init.d目录)
 把 4,6生成的文件(inittab和 fastab )放到 /mnt/etc/目录
 把 2 生成的文件linuxrc 放到/目录
         这里所提到的 /目录即my_rootfs目录。
10. 新建/dev设备,在/dev目录(即my_rootfs/dev/).
 mknod console c 5 1

8. 生成cramfs文件
 
 ----------------------------------------------------------------
 下载mkfs.cramfs工具,然后用下面命令生成你要的cramfs文件系统
 ./mkfs.cramfs  ./my_rootfs    ./root.cramfs

 移植就这么简单,剩下的就是下载,烧写内核,文件系统等。

 
阅读(1474) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~