linux 系统移植

注意:编译内核时,最好使用make zImage,编译完成之后再把zImage转换成uImage格式,这是肯定可以执行的,但是make uImage生成的uImage文件不一定能执行。
1、修改顶层Makefile
 ARCH ?=arm
 CROSS_COMPILE ?=arm-linux-

2、清除数据
 make distclean
 
3、查看arm架构的板级配置文件
 find -name *2410_defconfig
 find -name *2440_defconfig
   由于2410只有s3c2410_defconfig
    2440只有mini2440_defconfig
   所以我们使用s3c2410_defconfig配置文件编译
  
4、make s3c2410_defconfig

5、make uImage

6、cp ./arch/arm/boot/uImage /tftpboot

7、开发板使用tftp下载uImage 启动
 tftp 0x30008000 uImage
  如果启动过程中出现乱码,需要设置波特率
  setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
  由于我们U-BOOT设置的“machid”为362,及0x16a,所以启动内核时使用的是S3C2440开发板,
  如果设置波特率还是乱码,那么需要修改mach-smdk2440.c
  vi ./arch/arm/mach-s3c24xx/mach-smdk2440.c
  把s3c24xx_init_clocks(16934400);
  修改为s3c24xx_init_clocks(12000000);
  重新编译后再烧写进开发板,应该就不会出现乱码的情况。
 
 
二、MTD分区
1、烧写打印信息:
 Creating 8 MTD partitions on "NAND":
 0x000000000000-0x000000004000 : "Boot Agent"
 mtd: partition "Boot Agent" doesn't end on an erase block -- force read-only
 0x000000000000-0x000000200000 : "S3C2410 flash partition 1"
 0x000000400000-0x000000800000 : "S3C2410 flash partition 2"
 0x000000800000-0x000000a00000 : "S3C2410 flash partition 3"
 0x000000a00000-0x000000e00000 : "S3C2410 flash partition 4"
 0x000000e00000-0x000001800000 : "S3C2410 flash partition 5"
 0x000001800000-0x000003000000 : "S3C2410 flash partition 6"
 0x000003000000-0x000010000000 : "S3C2410 flash partition 7"
 
2、从上面的打印信息知道默认分配了8个分区,是在哪分区的呢?搜索关键字"Boot Agent"

3、使用grep命令搜索:grep "\"Boot\ Agent"\" * -nR

4、搜索结果发现:arch/arm/mach-s3c24xx/common-smdk.c:114:  .name   = "Boot Agent",

5、进入文件:vi arch/arm/mach-s3c24xx/common-smdk.c +114

6、修改后:
static struct mtd_partition smdk_default_nand_part[] = {
 [0] = {
  .name = "u-boot",
  .size = SZ_256K,
  .offset = 0,
 },
 [1] = {
  .name = "param",
  .offset = MTDPART_OFS_APPEND,
  .size = SZ_128K,
 },
 [2] = {
  .name = "kernel",
  .offset = MTDPART_OFS_APPEND,
  .size = SZ_4M,
 },
 [3] = {
  .name = "rootfs",
  .offset = MTDPART_OFS_APPEND,
  .size = MTDPART_SIZ_FULL,
 }
};

7、MTDPART_OFS_APPEND是紧接着上一个分区的意思,MTDPART_SIZ_FULL是剩下的大小

8、再次编译内核
 make zImage
 把u-boot的tools目录下的mk2uimage 拷贝到arch/arm/boot/
 把编译生成的zImage转变为uImage格式,这是u-boot支持的格式
 在arch/arm/boot/目录下执行:./mkz2uimage
 最后把uImage拷贝考/tftpboot目录下
 
9、打印信息,分区的大小跟我分配的一样,说明成功了
 Creating 4 MTD partitions on "NAND":
 0x000000000000-0x000000040000 : "u-boot"
 0x000000040000-0x000000060000 : "param"
 0x000000060000-0x000000460000 : "kernel"
 0x000000460000-0x000010000000 : "rootfs"
 
10、到这里,说明内核移植基本成功,后面的工作是制作根文件系统,还有移植驱动,最后都编译进内核

11、移植内核成功后,根据实际情况裁剪内核
 所谓裁剪内核,就是把需要的编译进内核,不需要的不用编译
 

三、制作文件系统
1、下载busybox
 http://www.busybox.net/downloads/
2、解压busybox-1.20.0.tar.bz
 tar -xvjf busybox-1.20.0.tar.bz2
3、选择交叉编译工具
 make menuconfig
 Busybox Settings  --->
  Build Options  ---> 
   () Cross Compiler prefix
     填写arm-linux-
 最后make编译 
 
3. 安装busybox
   安装:make install CONFIG_PREFIX=/home/book/nfs/fs_mini_mdev_new

4. 创建lib目录
mkdir /home/book/nfs/fs_mini_mdev_new/lib
mkdir /home/book/nfs/fs_mini_mdev_new/usr/lib -p

cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so*  /home/book/nfs/fs_mini_mdev_new/lib -d
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so*  /home/book/nfs/fs_mini_mdev_new/usr/lib -d

5. 构建etc目录
 cp -rf /work/nfs_root/fs_mini_mdev_new/etc /home/book/nfs/fs_mini_mdev_new
6. 构建dev目录
 mkdir dev
 mknod dev/console c 5 1
 mknod dev/null c 1 3
7. 其他空目录
 mkdir proc tmp mnt sys root
 
四、建立jffs2文件系统
1、mkfs.jffs2工具下载:
 apt-get install mtd-utils
 
2、mkfs.jffs2使用帮助:
 mkfs.jffs2 help
 
3、建立文件:mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2

下载烧写:
擦除nand:
 tftp 0x30008000 fs_mini_mdev_new.jffs2
 nand erase 460000 4000000  //460000是root分区的开始地址,4000000擦除nand分区大小
 //nand erase.part root
 nand write 30008000 460000 $filesize
 
 注意:如果需要使用nand erase.part命令,那么需要注意mtdparts的参数,而不是我们自己给内核分区的名字。
  使用printenv查看mtdparts的参数,如:mtdparts=mtdparts=jz2440-0:256k(u-boot),128k(param),4m(kernel),-(RootFs)
 
设置uboot参数:
 /*mtdblock3:即mtd分区,第三块分区,就是root分区*/
 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 
 
出现错误:Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
解决: 重新配置内核支持EABI
 make menuconfig
 ------------------------------------------------
 Kernel Features  --->
  Use the ARM EABI to compile the kernel
 ------------------------------------------------
 保存设置,重新编译
 
 
五、制作yaffs2文件系统
1、在ubuntu获取源码:git clone git://www.aleph1.co.uk/yaffs2
 会在/home/book目录下生成yaffs2文件夹,这就是下载的yaffs2文件
2、进入yaffs2文件夹:
 如:cd yaffs-dir
3. 打补丁

./patch-ker.sh  c m linux-tree   比如 ./patch-ker.sh c m /home/book/tools/linux-3.4.2

3、打补丁后在./patch-ker.sh c m /home/book/tools/linux-3.4.2/fs/新增YAFFS2文件

4、配置内核,YAFFS2添加进内核
 make menuconfig
 
 使用搜索“yaffs”:
  Location:                                                                                x
    x     -> File systems                                                                        x
    x       -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])                                 x
    x         -> yaffs2 file system support (YAFFS_FS [=y])                                      x
    x           -> 512 byte / page devices (YAFFS_YAFFS1 [=y])                                   x
    x             -> Use older-style on-NAND data format with pageStatus byte (YAFFS_9BYTE_TAGS 
   
 重新编译内核:make uImage
 
 
====================================================================================================================================== 
关于在menuconfig搜索“yaffs2”,下面是搜索结果: 

----------------------------------------------------------------------------------------------------------------------------------
  Symbol: YAFFS_YAFFS2 [=y]                                                                                                     x
  x Type  : boolean                                                                                                             x
  x Prompt: 2048 byte (or larger) / page devices                                                                                x
  x   Location:                                                                                                                 x
  x     -> File systems                                                                                                         x
  x       -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])                                                                  x
  x (2)     -> yaffs2 file system support (YAFFS_FS [=y])                                                                       x
  x   Defined at fs/yaffs2/Kconfig:72                                                                                           x
  x   Depends on: MISC_FILESYSTEMS [=y] && YAFFS_FS [=y]                                                                        x
  x   Selected by: YAFFS_FS [=y] && MISC_FILESYSTEMS [=y] && MTD_BLOCK [=y]  
----------------------------------------------------------------------------------------------------------------------------------

看到这最后一行:x   Selected by: YAFFS_FS [=y] && MISC_FILESYSTEMS [=y] && MTD_BLOCK [=y]  
提示我们要使用YAFFS_YAFFS2 [=y],就得选上那几项,就是说都是“y”,那说明就可以了。
======================================================================================================================================

5、把fs_mini_mdev_new制作成yaffs2文件
 cd /home/book/nfs/
 mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
 
 
6、把fs_mini_mdev_new.jffs2烧写进mtd的root分区 
 首先把fs_mini_mdev_new.jffs2拷贝到tftpboot文件夹下面,并且一定得赋予权限:
 chmod 777 fs_mini_mdev_new.jffs2
 tftp 0x30008000 fs_mini_mdev_new.yaffs2
 nand erase.part RootFs 
 //nand write 30008000 460000 $filesize
 一定得使用下面这个写:
 nand write.yaffs 30008000 460000  $filesize
 
 设置uboot参数:
 /*mtdblock3:即mtd分区,第三块分区,就是root分区*/
 setenv bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs2
 
7、烧写错误TFTP error: 'Access violation' (2)
 出现这种情况可能制作yaffs2文件出现问题,可以查看yaffs2文件的权限,如果不是666,那么
 得设置为666,然后再重新烧写即可。

8、烧写重新编译的uImage
 出现错误:Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
 解决办法:可能是uboot的问题,使用以前好的uboot启动,结果发现真是uboot的问题,因此,我们需要再次修改我们的uboot。
 修改:nand_util.c
 把函数:int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
   u_char *buffer, int flags)
  if (!need_skip && !(flags & WITH_DROP_FFS))  
 修改成:if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB))
 重新编译U-BOOT, 最后烧写新的u-boot。
 tftp扫写u-boot到nandflash的u-boot分区:0x000000000000-0x000000040000 : "u-boot"
 tftp 0x30008000 u-boot.bin
 nand erase.part u-boot
 //nand erase 0 40000  //0是u-boot分区的开始地址,40000擦除nand分区大小
 nand write 30008000 0 $filesize

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值