一、框架介绍及简单修改
1.1 Bootloader如何引导内核
Bootloader的工作:
(1)讲内核读入内存中
(2)存一些内核启动参数到指定位置,内核启动时去解析
(3)启动内核,传入机器ID
1.2、内核的启动流程:
首先 内核的最终目的是挂接根文件系统,并启动应用程序。
想启动应用程序—需要挂接根文件系统—装载驱动程序(flash、网卡)--要解析参数(文件系统在哪)--根据R1判断内核是否支持该ID—支持调用初始化相关函数
每个开发板都有不同的硬件参数
内核移植过程中要决定我这个内核支持哪些硬件开发板
我在内核里针对这个开发板给他一个ID。Uboot启动的时候传入和内核中设置好的匹配起来。
(1)解压tar xjf linux-3.4.2.tar.bz2
(2)修改makefile vi makefile
修改架构为 ARM 以及编译器
(3)选择默认配置find -name"*defconfig"
linux-3.4.2/arch/arm/configs$ ls
make s3c2410_defconfig(生成.config文件)
查看支持的单板
(4)编译make uImage
建立source insight工程
(5)拷贝生成的内核文件到nfs服务器
cp arch/arm/boot/uImage /work/nfs_root/uImage_new
(6)下载内核到32000000
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new (需要在linux虚拟机上设置开发板IP)
测试nfs:mount -t nfs 192.168.1.101:/work/nfs_root/ /mnt/nfs
(7)启动内核
(8)u-boot2012里默认的是193机器ID
(9)现在内核支持很多单板
随便设置一个机器ID
内核启动时提示,不支持这个设备
支持的如上,支持太多内核庞大
(10)设置机器ID为362 使用SMDK2440(362)查看开发手册:
、
(11)
设置为16a 下载 启动----会乱码
用mini2440的机器ID 1999,设置启动参数:
set serverip 192.168.1.101
set ipaddr 192.168.1.116
set machid 7CF
set bootargs console=ttySAC0,115200root=/dev/mtdblock3
save
nfs 32000000192.168.1.101:/work/nfs_root/uImage_new
bootm 32000000(7cf成功启动,没有乱码)
7cf 成功 已经默认12M
16a 乱码 不是12
(12)修改162单板的晶振信息
修改晶振
cd arch/arm/mach-s3c24xx/
vi mach-smdk2440.c
cp arch/arm/boot/uImage/work/nfs_root/uImage_new
set serverip 192.168.1.101
set ipaddr 192.168.1.116
set machid 16a
set bootargs console=ttySAC0,115200root=/dev/mtdblock3
save
nfs 32000000192.168.1.101:/work/nfs_root/uImage_new
bootm 32000000此时内核在开发板上启动成功,有如下输出:
二、修改分区
Common-smdk.c (linux-2.6.22.6\arch\arm\plat-s3c24xx) 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 = SZ_16M, } };
static struct mtd_partition smdk_default_nand_part[] = {}结构体数组里的内容替换成 static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "bootloader", .size = SZ_256K, .offset = 0, }, // MTDPART_OFS_APPEND表示分区开始的偏移地址紧接着上一个分区 [1] = { .name = "params", .offset = MTDPART_OFS_APPEND, .size = SZ_128K, }, [2] = { .name = "kernel", .offset = MTDPART_OFS_APPEND, .size = SZ_4M, }, //MTDPART_SIZ_FULL表示取剩余下的容量 [3] = { .name = "rootfs", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, } };
重新编译内核,并拷贝新分区好的内核到NFS
cp arch/arm/boot/uImage /work/nfs_root/uImage_new
先下载一个已经一直好的内核
此时内核可以正常启动,并打印出设置好的分区信息,但没有挂接上根文件系统
三、制作根文件系统
内核用哪个编译器,文件系统制作就用哪个编译器
(1) 编译busybox
rm -rf busybox-1.20.0
tar xjf busybox-1.20.0.tar.bz2
配置编译环境
Make
创建安装路径:
mkdir fs_mini_mdev_new
指定路径下安装
make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new/
安装库glibc:
查看交叉工具类地址
使用这两个库:
创建LIB目录
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -d
-d:如果是链接文件 则当做链接文件拷贝,而不拷贝实际对应文件
创建usr/lib
-p 不存在则直接创建全部文件
mkdir /work/nfs_root/fs_mini_mdev_new/usr/lib -p
创建etc目录:
cp fs_mini_mdev/etc/ fs_mini_mdev_new/ -rf
执行这个脚本:
然后启动sheel
执行完脚本后,启动sheel,shell从console得到设备输入。
console对应什么设备呢?对应传入的命令行参数,console=ttySAC0,串口0。
创建dev目录:
创建其他目录:
制作镜像文件 jffs2
先安装jffs2工具
生成文件系统
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2
-s nand扇区大小 -e 可擦除块 (根据使用的nand flash信息来配置)
出现如下问题
内核中查找 exitcode
开启内核的Eabi接口
到此内核启动成功,能打印正确的分区信息,并可以挂接上移植好的文件系统。
但是此时内核:
(1)不支持yaffs文件系统
(2)支持太多单板,过于庞大
(3)一些驱动不支持,如网卡驱动,flash驱动,led按键驱动等等。
简单移植内核操作:
cp arch/arm/boot/uImage /work/nfs_root/uImage_newset machid 16a
set serverip 192.168.1.101
set ipaddr 192.168.1.116
set bootargs console=ttySAC0,115200root=/dev/mtdblock3
save
nfs 32000000192.168.1.101:/work/nfs_root/uImage_new
移植文件系统操作:nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev_new.jffs2(可能会出错,怀疑上网络不稳定)
nand erase.part rootfs(需要uboot支持)
nand write.jffs2 30000000 260000 $filesize(1.1.6的uboot 需要带括号)
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_eabi
bootm 32000000