笔记毕业班第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
- 笔记毕业班第3课移植3.4.2内核
- 毕业班视频移植3.4.2内核支持yaffs2
- Linux学习内核移植相关笔记第3部分
- Linux学习内核移植相关笔记第2部分
- Linux-3.4.2内核移植调试笔记
- 移植3.4.2内核
- Linux学习内核移植相关笔记第1部分
- Linux学习内核移植相关笔记第4部分
- OK6410内核移植笔记
- linux内核移植笔记
- jz2440linux内核移植笔记
- linux-3.4.2内核移植
- 移植Linux 3.4.2 内核
- linux内核移植-DM9000C移植笔记
- TE2440II内核移植笔记--redxu
- Uboot、内核、文件、移植 笔记
- 笔记第10课内核启动流程
- 移植内核学习笔记3-----支持yaffs文件系统
- 第三课2 重写用户登录模块(整合Jquery+JSON做验证)
- Divide and Conquer
- 大学物理思维导图
- How to think like a Computer Scientist: 课后习题第七章 14-17
- Java使用默认浏览器打开指定URL
- 笔记毕业班第3课移植3.4.2内核
- vs2010上进行ACE编程常见编译错误解决方法
- linux内核spin_lock分析
- 面试题---成员变量和局部变量的区别
- 让Qt应用程序跑在Android上
- [LeetCode]Regular Expression Matching、Wildcard Matching
- Hibernate中实现MYSQL的limit功能
- 使用 Spring 3 来创建 RESTful Web Services
- Non-blocking Web Service Client