笔记毕业班第3课移植3.4.2内核

来源:互联网 发布:linux ioctl函数 编辑:程序博客网 时间:2024/04/28 12:31

解压下载的内核:
book@book-desktop:/work/system$ rm -rf linux-3.4.2
book@book-desktop:/work/system$ tar xjf linux-3.4.2.tar.bz2

一. 内核启动流程,据此配置内核(机器ID)
1.1 修改Makefile
book@book-desktop:/work/system$ cd linux-3.4.2/
book@book-desktop:/work/system/linux-3.4.2$ vi Makefile
原来:  ARCH            ?= $(SUBARCH)
 CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)
更改后:
 ARCH            ?= arm
 CROSS_COMPILE   ?= arm-linux-
查看编译器版本:
book@book-desktop:/work/system/linux-3.4.2$ arm-linux-gcc -v
gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
1.2 选择默认配置 : make s3c2410_defconfig
book@book-desktop:/work/system/linux-3.4.2$ find -name "*defconfig"
book@book-desktop:/work/system/linux-3.4.2$ cd arch/arm/configs/
book@book-desktop:/work/system/linux-3.4.2/arch/arm/configs$ ls *2440*
mini2440_defconfig
book@book-desktop:/work/system/linux-3.4.2/arch/arm/configs$ ls *2410*
s3c2410_defconfig
book@book-desktop:/work/system/linux-3.4.2/arch/arm/configs$ cd ../../../
book@book-desktop:/work/system/linux-3.4.2$ make s3c2410_defconfig
1.3 make uImage
book@book-desktop:/work/system/linux-3.4.2$ make uImage

拷贝生成的文件
 book@book-desktop:/work/system/linux-3.4.2$ cp arch/arm/boot/uImage /work/
nfs_root/uImage_new

/******************************************************************************
******
下面可能是因为实在没有办法的情况下做的选择,用tftp下载,用NFS
下载会报错,可以将就着用:
*******************************************************************************
******
设置好环境变量:这个问题已经解决(原来报错的原因是因为uboot里面nfs.c
文件延时不够导致的)
 原来:bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
 要改为SMDK2410 # set bootcmd 'nand read 30000000 kernel;bootm 30000000'
 原来:bootargs=console=ttySAC0 root=/dev/mtdblock3
 要改为set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
 SMDK2410 # save
通过tftp下载进开发板:执行tftp的前提是启动了tftp软件并设置好了server IP
 tftp 30000000 uImage_new_1
 nand erase.part kernel
 nand write 30000000 kernel
*******************************************************************************
******
*******************************************************************************
*****/

到这里,我们可以看到内核启动起来了,但是输出来的全是乱码。
下面找问题:打开uboot si 工程,在cmd_bootm.c里面
do_bootm
   boot_fn = boot_os[images.os.os];
       [IH_OS_LINUX] = do_bootm_linux,
          do_bootm_linux
              boot_jump_linux(images);
                  boot_jump_linux
                     unsigned long machid = gd->bd->bi_arch_number;//这个是
machid的默认值
                     s = getenv("machid");//可以从环境变量里面得到machid
                     kernel_entry(0, machid, r2);//跳入内核,传入参数
在工程里面全局搜索在smdk2410.c里面gd->bd->bi_arch_number可知MACH_TYPE_SMDK2410
=193
 
book@book-desktop:/work/system/linux-3.4.2/arch/arm$ find -name "mach*.o"
我们可以知道这个开发板支持很多种单板.我们可以随便设置一下
SMDK2410 # set machid 33245
SMDK2410 # save
SMDK2410 # nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
SMDK2410 # bootm 32000000
然后会在串口打印出支持的id号。
                  
步骤1:
在UBOOT里:
set machid 16a   // smdk2440  mach-smdk2440.c

set machid 7CF   // mini2440  mach-mini2440.c
到这里还是乱码,所以怀疑是波特率的问题:于是设置波特率:
SMDK2410 # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
SMDK2410 # save
SMDK2410 # nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
SMDK2410 # bootm 32000000

设为7CF 这里终于有输出了。为什么16a没有输出呢?
对比一下mach-smdk2440.c和mach-mini2440.c发现里面MACHINE_START(MINI2440, "
MINI2440")里面的.map_io= mini2440_map_io有问题

步骤2:
arch\arm\mach-s3c24xx\mach-smdk2440.c
s3c24xx_init_clocks(16934400);
改为
s3c24xx_init_clocks(12000000);

步骤3:
配置/编译: make s3c2410_defconfig 或 make mini2440_defconfig
           make uImage
book@book-desktop:/work/system/linux-3.4.2$ cp arch/arm/boot/uImage /work/
nfs_root/uImage_new
步骤4:
在uboot里:set bootargs console=ttySAC0,115200 .....


uboot的默认MACH ID:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;  // 193
如果s = getenv("machid");成功,则使用它
否则使用默认的

set machid 16a   // smdk2440  mach-smdk2440.c
set machid 7CF   // mini2440  mach-mini2440.c

用NFS下载到内存、然后重启:
nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
bootm 32000000

通过上面四个步骤就可以编译出能够有正确输出的内核来.

找MACH_TYPE_S3C2440:
book@book-desktop:/work/system/linux-3.4.2$ find -name mach-types.h
./include/generated/mach-types.h
./arch/arm/include/asm/mach-types.h
book@book-desktop:/work/system/linux-3.4.2$ vi ./arch/arm/include/asm/mach-
types.h
book@book-desktop:/work/system/linux-3.4.2$ vi include/generated/mach-types.h
里面就有:#define MACH_TYPE_S3C2440              362

二. 修改分区, 制作新的文件系统
虽然已经有正确的输出了,还是启动不了,分区有问题。
从内核提示的分区信息,我们可以在内核里面搜索一下
book@book-desktop:/work/system/linux-3.4.2$ grep "\"Boot\ Agent\"" * -nR
arch/arm/mach-s3c24xx/common-smdk.c:113:                .name   = "Boot Agent",
改一下这个:
static struct mtd_partition smdk_default_nand_part[] = {
 [0] = {
  .name = "Boot Agent",
  .size = SZ_16K,
  .offset = 0,
 },
 [1] = {
  .name = "S3C2410 flash partition 1",
  .offset = 0,
  .size = SZ_2M,
 },
 [2] = {
  .name = "S3C2410 flash partition 2",
  .offset = SZ_4M,
  .size = SZ_4M,
 },
 [3] = {
  .name = "S3C2410 flash partition 3",
  .offset = SZ_8M,
  .size = SZ_2M,
 },
 [4] = {
  .name = "S3C2410 flash partition 4",
  .offset = SZ_1M * 10,
  .size = SZ_4M,
 },
 [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 = MTDPART_SIZ_FULL,
 }
};
改为:
static struct mtd_partition smdk_default_nand_part[] = {
 [0] = {
  .name = "bootloader",
  .size = SZ_256K,
  .offset = 0,
 },
 [1] = {
  .name = "params",
  .offset = MTDPART_OFS_APPEND,
  .size = SZ_128K,
 },
 [2] = {
  .name = "kernel",
  .offset = MTDPART_OFS_APPEND,
  .size = SZ_2M,
 },
 [3] = {
  .name = "rootfs",
  .offset = MTDPART_OFS_APPEND,
  .size = MTDPART_SIZ_FULL,
 }
};
book@book-desktop:/work/system/linux-3.4.2$ make uImage && cp arch/arm/boot/
uImage /work/nfs_root/uImage_new
下载内核:
SMDK2410 # nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
SMDK2410 # bootm 32000000
还是有问题,是不是因为没有下载文件系统呢?
先下载一个文件系统试一下.
nfs 30000000 192.168.1.51:/work/nfs_root/fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000  889bc0
SMDK2410 # nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
SMDK2410 # bootm 32000000
启动之后提示:No filesystem could mount root, tried:  ext3 ext2 cramfs vfat
msdos iso9660 romfs

我们这里应该已经支持jffs2文件系统了。
book@book-desktop:/work/system/linux-3.4.2$ vi .config
里面有CONFIG_JFFS2_FS=y,表明已经支持了jffs2

nfs 30000000 192.168.1.51:/work/nfs_root/fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000  $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
SMDK2410 # nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
SMDK2410 # bootm 32000000
还是不行
/***********************************************************************
通过tftp下载进开发板:执行tftp的前提是启动了tftp软件并设置好了server IP
 tftp 30000000 fs_mini_mdev.jffs2
 nand erase.part rootfs
 nand write 30000000 rootfs
************************************************************************/
set machid 7CF   // mini2440  mach-mini2440.c
SMDK2410 # nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
SMDK2410 # bootm 32000000
启动内核后出现:
Creating 4 MTD partitions on "nand":
0x000000000000-0x000000040000 : "u-boot"
0x000000040000-0x000000060000 : "u-boot-env"
0x000000060000-0x000000560000 : "kernel"
0x000000560000-0x000010000000 : "root"
①搜索找到对应的文件,如果想要使用mini2440的话把分区改为想要的分区
book@book-desktop:/work/system/linux-3.4.2$ grep "u-boot-env" * -nR
arch/arm/mach-s3c24xx/mach-mini2440.c:255:              .name   = "u-boot-env",

三:制作文件系统
book@book-desktop:/work/system$ rm -rf busybox-1.20.0
book@book-desktop:/work/system$ tar xjf busybox-1.20.0.tar.bz2
book@book-desktop:/work/system$ cd busybox-1.20.0/
book@book-desktop:/work/system/busybox-1.20.0$ ls
book@book-desktop:/work/system/busybox-1.20.0$ make menuconfig
在里面选择交叉编译前缀()  Cross Compiler prefix (NEW)
改为:arm-linux- 

book@book-desktop:/work/system/busybox-1.20.0$ make
在/work/nfs_root建立如下目录:作为busybox的安装目录
book@book-desktop:/work/nfs_root$ mkdir fs_mini_mdev_new

book@book-desktop:/work/system/busybox-1.20.0$ vi README
1. 交叉编译busybox
   安装:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new

2. 安装库
book@book-desktop:/work/system/busybox-1.20.0$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/
local/arm/4.3.2/bin
book@book-desktop:/work/system/busybox-1.20.0$ cd /usr/local/arm/4.3.2/bin
book@book-desktop:/usr/local/arm/4.3.2/bin$ cd ..
book@book-desktop:/usr/local/arm/4.3.2$ ls
arm-none-linux-gnueabi  bin  lib  libexec  share
book@book-desktop:/usr/local/arm/4.3.2$ find -name lib
./arm-none-linux-gnueabi/libc/thumb2/lib
./arm-none-linux-gnueabi/libc/thumb2/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/lib
./arm-none-linux-gnueabi/libc/armv4t/usr/lib
./arm-none-linux-gnueabi/libc/lib
./arm-none-linux-gnueabi/libc/usr/lib
./arm-none-linux-gnueabi/lib
./lib
book@book-desktop:/usr/local/arm/4.3.2$ cd ./arm-none-linux-gnueabi/libc/
armv4t/lib

拷贝两个库:

mkdir /work/nfs_root/fs_mini_mdev_new/lib
mkdir /work/nfs_root/fs_mini_mdev_new/usr/lib -p

cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so*  /work/
nfs_root/fs_mini_mdev_new/lib -d
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so*  /work
/nfs_root/fs_mini_mdev_new/usr/lib -d

3. 构建etc目录
book@book-desktop:/work/nfs_root$ cp fs_mini_mdev/etc fs_mini_mdev_new -rf

4. 构建dev目录
book@book-desktop:/work/nfs_root/fs_mini_mdev_new$ mkdir dev
book@book-desktop:/work/nfs_root/fs_mini_mdev_new$ ls -l /dev/console /dev/null
crw------- 1 root root 5, 1 2013-07-28 18:58 /dev/console
crw-rw-rw- 1 root root 1, 3 2013-07-28 18:33 /dev/null
book@book-desktop:/work/nfs_root/fs_mini_mdev_new$ sudo mknod dev/console c 5 1
[sudo] password for book:
book@book-desktop:/work/nfs_root/fs_mini_mdev_new$ sudo mknod dev/null c 1 3

5. 其他空目录
book@book-desktop:/work/nfs_root/fs_mini_mdev_new$ mkdir proc tmp mnt sys root

6.制作映像文件
book@book-desktop:/work/nfs_root$ mkfs.jffs2 -n -s 2048 -e 128KiB -d
fs_mini_mdev_new -o fs_mini_mdev_new.jffs2 

7.烧写刚制作的映像文件:
nfs 30000000 192.168.1.51:/work/nfs_root/fs_mini_mdev_new.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000  $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.1.51:/work/nfs_root/uImage_new
bootm 32000000

启动内核之后还是有问题:Kernel panic - not syncing: Attempted to kill init!
exitcode=0x00000004
在si里搜索:exitcode 得到:Exit.c (kernel):   panic("Attempted to kill init!
exitcode=0x%08x\n",
SIGILL   illegal instruction
在gcc编译器里面找到问题,EABI接口
6. 重新配置内核支持EABI
book@book-desktop:/work/system/linux-3.4.2$ make menuconfig
在里面选择EABI接口
book@book-desktop:/work/system/linux-3.4.2$ make uImage
book@book-desktop:/work/system/linux-3.4.2$ cp arch/arm/boot/uImage /work/
nfs_root/uImage_eabi

set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.1.51:/work/nfs_root/uImage_eabi
bootm 32000000

三. 移植YAFFS文件系统
1. 获得源码
git clone git://www.aleph1.co.uk/yaffs2
如果系统没有装git那么:
book@book-desktop:/work/system$ sudo apt-install git clone git://www.aleph1.co
.uk/yaffs2

2. 打补丁
cd yaffs-dir
./patch-ker.sh  c m linux-tree   比如 ./patch-ker.sh c m /work/system/linux-3.
4.2

book@book-desktop:~$ cd /work/system/yaffs2/
book@book-desktop:/work/system/yaffs2$ vi README-linux
Integrating YAFFS2 into a Linux 2.6.x kernel
book@book-desktop:/work/system/yaffs2$ ./patch-ker.sh c m /work/system/linux-3
.4.2

3. 配置内核支持YAFFS
book@book-desktop:/work/system/linux-3.4.2$ ls fs/yaffs2/
book@book-desktop:/work/system/linux-3.4.2$ make menuconfig
book@book-desktop:/work/system/linux-3.4.2$ make uImage
到这里出现一大堆错误
把linux下的yaffs2拷贝到si下的fs里面,同步文件
修改文件

4. 编译、使用uImage
book@book-desktop:/work/system/linux-3.4.2$ make uImage
book@book-desktop:/work/system/linux-3.4.2$ cp arch/arm/boot/uImage /work/
nfs_root/uImage_yaffs

5. 制作、烧写yaffs映象
book@book-desktop:/work/system/linux-3.4.2$ cd /work/nfs_root/
book@book-desktop:/work/nfs_root$ mkyaffs2image fs_mini_mdev_new
fs_mini_mdev_new.yaffs2

uboot:
nfs 30000000 192.168.1.51:/work/nfs_root/fs_mini_mdev_new.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000  $filesize

6. 启动
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
nfs 32000000 192.168.1.51:/work/nfs_root/uImage_yaffs
bootm 32000000

7. 没成功,用替代法查找问题
7.1 UBOOT可能有问题:换上1.1.6的UBOOT
tftp 30000000 u-boot.bin
nand erase.part u-boot
nand write 30000000 u-boot
reset
nfs 30000000 192.168.1.51:/work/nfs_root/fs_mini_mdev_new.yaffs2
nand erase rootfs
nand write.yaffs 30000000 260000  $(filesize)
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
nfs 32000000 192.168.1.123:/work/nfs_root/uImage_yaffs
bootm 32000000

发现1.1.6的UBOOT没问题,所以就是我们移植的新UBOOT有BUG:
drivers\mtd\nand\Nand_util.c

 if (!need_skip && !(flags & WITH_DROP_FFS)) {
改为
 if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) {
重新编译uboot:
book@book-desktop:~$ cd /work/system/u-boot-2012.04.01
book@book-desktop:/work/system/u-boot-2012.04.01$ make
book@book-desktop:/work/system/u-boot-2012.04.01$ cp u-boot.bin /work/nfs_root
/u-boot_new.bin

7.2 YAFFS映象可能有问题


总结:
制作了u-boot_new.bin, uImage_new, fs_mini_mdev_new.yaffs
重烧整个系统:
使用jtag工具烧u-boot_new.bin
或使用uboot来更新自己: tftp 30000000 u-boot_new.bin; nand erase.part u-boot;
nand write 30000000 u-boot
启动uboot,用它来烧写内核、FS
tftp 30000000 uImage_new; nand erase.part kernel; nand write 30000000 kernel
tftp 30000000 fs_mini_mdev_new.yaffs2; nand erase.part rootfs; nand write.
yaffs 30000000 260000  $filesize

设置参数
set 'nand read 30000000 kernel;bootm 30000000'
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
set machid 16a
save

制作内核补丁:
book@book-desktop:/work/system/linux-3.4.2$ cp .config config_ok
book@book-desktop:/work/system/linux-3.4.2$ make distclean
book@book-desktop:/work/system/linux-3.4.2$ cd ..
book@book-desktop:/work/system$ mv linux-3.4.2 linux-3.4.2_100ask
book@book-desktop:/work/system$ tar xjf linux-3.4.2.tar.bz2
book@book-desktop:/work/system$ diff -urN linux-3.4.2 linux-3.4.2_100ask >
linux-3.4.2_100ask.patch


使用内核补丁:
book@book-desktop:/work/system$ cd linux-3.4.2
book@book-desktop:/work/system/linux-3.4.2$ patch -p1 < ../linux-3.4.2_100ask.
patch
book@book-desktop:/work/system/linux-3.4.2$ cp config_ok .config
book@book-desktop:/work/system/linux-3.4.2$ make uImage

 


 

原创粉丝点击