您的位置:首页 > 运维架构 > Linux

05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统

2017-04-09 11:48 791 查看

一、框架介绍及简单修改

1.1 Bootloader如何引导内核

Bootloader的工作:

(1)讲内核读入内存中

(2)存一些内核启动参数到指定位置,内核启动时去解析

(3)启动内核,传入机器ID



1.2、内核的启动流程:

首先 内核的最终目的是挂接根文件系统,并启动应用程序。

想启动应用程序—需要挂接根文件系统—装载驱动程序(flash、网卡)--要解析参数(文件系统在哪)--根据R1判断内核是否支持该ID—支持调用初始化相关函数



每个开发板都有不同的硬件参数

内核移植过程中要决定我这个内核支持哪些硬件开发板

我在内核里针对这个开发板给他一个ID。Uboot启动的时候传入和内核中设置好的匹配起来。

1.3 移植linux3.4.2到JZ2440
(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
此时内核在开发板上启动成功,有如下输出:



二、修改分区

1根据报错,搜索







有如下默认分区:
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



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







创建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_new

set 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐