linux 2.6.22.1内核在s3c2410平台的移植(完美版)

导读:
  -------------------作者:无猫
  ++++++++++++++++++++++++++++++++++++++++++++++
  ----------------------------------------------
  bootloader编译环境:
  vivi版本:0.1.4
  交叉编译器(CROSS-COMPILE)版本:2.95.3
  (下载地址略:网上很多搜下。)
  操作系统:Fedora 7
  ======================================
  linux内核编译环境:
  内核版本:linux2.6.22.1
  交叉编译器(CROSS-COMPILE)版本: 4.2.0
  (下载地址:
  http://www.codesourcery.com/gnu_toolchains/arm/download.html)
  注意:下载选项,要选 ARM EABI 的选项,和 IA32 GNU/linux
  操作系统: Fedora 7
  ======================================
  文件系统编译环境:
  busybox1.5.1,或1.4.2
  交叉编译器(CROSS-COMPILE)版本: 3.3.2
  (下载地址:http://linux.omap.com/pub/toolchain/)
  操作系统: 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下载地址:http://linux.omap.com/pub/toolchain/)
  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, 静态编译
  编译更详细的内容:
  http://hi.baidu.com/wangy0919/blog/item/5959a819e8325978dab4bd52.html
  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
  移植就这么简单,剩下的就是下载,烧写内核,文件系统等。聪明的你不用我说怎么做了吧
  
  :)
  来自:http://bbs.ss.pku.edu.cn/ss/index.php/5836/action_viewspace_itemid_11861.html

本文转自
http://hi.baidu.com/wangy0919/blog/item/e1f2013d4cbfc0ec3d6d9750.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值