移植内核linux-3.4.2
移植3.4.2内核—框架介绍及简单修改
获取linux内核源码
内核
启用应用程序(最终目标) <– 挂载根文件系统 <– 装载驱动程序(网卡、Flash) <– 解析TAG参数 <– 根据r1(机器ID),判断能否支持该机器,调用机器相关初始化函数
解压内核源码,并首次配置编译内核,并将新内核放到之前创建的根文件系统目录中
tar xjf linux-3.4.2.tar.gz
cd linux-3.4.2
vi Makefile (修改Makefile)
make s3c2410_defconfig
make uImage
cp arch/arm/boot/uImage /work/nfs_root/uImage_3.4.2
nfs下载新内核到sdram,启动新内核,出现乱码(如图)
nfs 32000000 192.168.0.3:/work/nfs_root/uImage_3.4.2
bootm 32000000
—启动新内核,乱码
注:这里出现一个小插曲---nfs下载时出现错误(图1); 解决措施:在ubutun上修改/etc/hosts文件(sudo vi /etc/hosts)(图2); 修改文件后,可以成功nfs下载(图3);
—图1
—图2
—图3
解决上述乱码问题
5.1 在串口上设置波特率
5.2 在串口上设置单板id
5.3 修改内核相关文件中的晶振频率Mach-smdk2440.c (arch\arm\mach-s3c24xx)
5.4 上传修该文件后,重新编译内核(make uImage),重新烧写,重启新内核
注:这里插讲一下5.2中的获取单板id
方法一:重启开发板,任意设置一个单板id(如:set machid 33456)后,nfs下载新内核,重启内核(bootm),串口会出现该uImage支持的单板和对应的id
方法二:在相关文件中查看
———-2017.11.28
移植3.4.2内核—修改分区及制作根文件系统
修改分区
1.1 接着上节5.4,根据如图提示,在内核源码中搜索”Boot Agent”,找到相关文件
1.2 修改文件中关于分区的部分
1.3 上传文件,重新编译内核(make uImage)并拷贝映像文件(cp …..),nfs下载新内核,重新启动,显示分区成功
尝试挂载jffs2文件系统
2.0 由于新内核启动后,提示未挂载成功文件系统(图1)。在.config文件中可以得知该映像支持JFFS2,还不支持YAFFS(在该文件中搜索)
2.1 尝试挂载jffs2文件系统(旧的jffs2文件系统)
—设置环境参数支持jffs2
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
—烧写fs_mini_mdev.jffs2(/work/nfs_root文件夹下)
nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 5b89a8
—烧写新内核
nfs 32000000 192.168.0.3:/work/nfs_root/uImage_3.4.2
bootm 32000000
—结果(没有成功)
制作根文件系统
3.1 移植Busybox
解压:tar xjf busybox-1.20.0.tar.bz2 进入文件夹:cd busybox-1.20.0 配置:make menuconfig Busybox Settings ---> Build Options --->
编译:make 在/work/nfs_root下创建安装目录:mkdir fs_mini_mdev_new 在busybox-1.20.0文件夹下执行安装命令:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new 进入安装位置,查看(如图)
3.2 安装glibc库
a. 找到库的存放位置(echo $PATH)
b. 拷贝库(-d:链接文件拷过去依旧是链接文件) 在fs_mini_mdev_new文件夹下,创建lib、usr/lib两个目录: mkdir lib mkdir usr/lib -p cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -d cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* usr/lib -d
3.3 构建/etc目录
a. 拷贝/work/nfs_root/tmp/fs_mini_mdev文件夹下的etc到/work/nfs_root/fs_mini_mdev_new下 (内核启动第一个进程后,打开inittab,根据inittab中的指令执行init.d中的rcS脚本,又根据该脚本中的mount -a命令挂接fatab中的各种根文件系统)
b. 微改inittab文件
3.4 构建/dev目录
a. 在/work/nfs_root/fs_mini_mdev_new下创建目录:mkdir dev b. 创建console节点:sudo mknod console c 5 1 创建null节点: sudo mknod null c 1 3 c. 查看
3.5 构建其他目录
在/work/nfs_root/fs_mini_mdev_new下创建其他目录: mkdir proc mnt tmp sys root 查看最终根文件系统目录:
制作jffs2映像文件
cd /work/nfs_root
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2
注释: -n: -s 2048: -e 128KiB: -d: -o:
重新烧写刚刚制作的jffs2文件系统,并烧写新内核,启动后出现错误(如图)
nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev_new.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 3b8e30
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.0.3:/work/nfs_root/uImage_3.4.2
bootm 32000000
解决上述出现的错误
6.1 在内核源码中搜索指示的错误关键字”exitcode”,一路找到相关宏定义
do_exit exit_notify forget_original_parent find_new_reaper(包含exitcode的函数,向上一直搜索调用,找到do_exit函数)
—再在源码中搜索do_exit,找到Seccomp.c文件,找到相关的宏定义(SIGILL = illegal instruction)
6.2 解决方法:配置内核,使其支持EABI
—配置
—重新编译,并重命名
make uImage cp arch/arm/boot/uImage /work/nfs_root/uImage_eabi_3.4.2
6.3 重启开发板后,设置环境参数,下载新内核uImage_eabi_3.4.2,启动内核后,串口显示如图,则成功挂载文件系统(如图)
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 nfs 32000000 192.168.0.3:/work/nfs_root/uImage_eabi_3.4.2 bootm 32000000
———2017.11.30
移植3.4.2内核—支持yaffs文件系统
(注)若ubutun可以安装git(现用的9.10版不行),则可以在https://yaffs.net/get-yaffs根据git命令下载(git clone git://www.aleph1.co.uk/yaffs2)
给3.4.2内核打yaffs2补丁,并配置内核使其支持yaffs文件系统
1.1 在网上下载的yaffs2源码(yaffs2-34292b4),进入yaffs2文件夹,打补丁(查看README-linux-patch如何给内核打补丁)
—下载源码
—README-linux
—打补丁
cd yaffs2-34292b4 ./patch-ker.sh c m /work/system/linux-3.4.2
—查看内核源码中是否已包含yaffs2目录
1.2 配置内核,使之支持yaffs文件系统,重新编译,出现一大堆错误
—进入内核文件夹,make menuconfig
—错误提示
1.3 逐步解决上述错误(将yaffs目录添加到si工程中,便于修改代码)
—根据错误提示,找到相关文件
—一步步找到结构体定义
—修改
—上传文件后,再次编译make uImage后,再次出现错误
—再次修改
—上传文件后,再次编译make uImage后,再次出现错误,再次修改
—上传文件后,再次编译make uImage后,再次出现错误,按照指示修改相关文件
—上传文件后,再次编译make uImage后,再次出现错误,按照指示修改相关文件
—上传文件后,再次编译make uImage,编译成功,并命名为uImage_4.3.2_yaffs2cp arch/arm/boot/uImage /work/nfs_root/uImage_4.3.2_yaffs2
制作yaffs2映像
—进入/work/nfs_root文件夹,将上节课的根文件系统fs_mini_mdev_new
制作成yaffs2映像mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
烧写刚制作的yaffs2映像(fs_mini_mdev_new.yaffs2),使用默认环境参数(默认文件类型为yaffs),nfs烧写新内核(uImage_4.3.2_yaffs2),启动内核,成功挂载yaffs文件系统
nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev_new.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 791340
nfs 32000000 192.168.0.3:/work/nfs_root/uImage_4.3.2_yaffs2
———-2017.12.2
移植3.4.2内核—裁剪及ECC简介及制作补丁
裁剪内核
1.1 查看截至上节编译的内核映像uImage的大小
1.2 第一次裁剪
配置内核:make menuconfig
—去掉一些不需要的单板
-> System Type -> SAMSUNG S3C24XX SoCs Support
—去掉不需要的文件系统
-> File systems
—再次make uImage,但大小为2.19M
1.3 第二次裁剪
—一些设备驱动
—一些文件系统
—再次make uImage,但大小为2.15M
1.4 第三次裁剪
—再次make uImage,将其复制到/work/nfs_root文件夹下,命名为uImage_small(但大小还为2.15M,依旧不能小于2M)
cp arch/arm/boot/uImage /work/nfs_root/uImage_small
解决内核大小超过2M,但依然想将其烧到Nand分区中的问题
解决措施:修改分区
2.1 修改uboot源码中的配置文件smdk2440.h,重新配置编译uboot
make smdk2440_config
make
2.2 修该内核源码中关于分区的文件:common_smdk.c
—重新编译内核,依旧将其复制到/work/nfs_root文件夹下,命名为uImage_small
make uImage
cp arch/arm/boot/uImage /work/nfs_root/uImage_3.4.2_small
重新烧写整个系统(u-boot.bin、uImage_small、fs_mini_mdev_new.yaffs2)
3.1 tftp烧写(更新)uboot
tftp 30000000 u-boot.bin nand erase.part u-boot nand write 30000000 u-boot
3.2 断电并设为nand启动,重新上电后,nfs下载内核映像到内核分区
—重启后可查看修改分区是否成功
—下载内核到内核分区
nfs 30000000 192.168.0.3:/work/nfs_root/uImage_3.4.2_small nand erase.part kernel nand write 30000000 kernel
3.3 nfs下载yaffs2映像到文件系统分区
nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev_new.yaffs2 nand erase.part rootfs nand write.yaffs 30000000 460000 $filesize
3.4 设置机器ID(smdk2440单板id为16a)
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 set machid 16a save
3.5 重启开发板,成功启动内核,并挂载yaffs文件系统
reset
补充:内核启动后,在打印信息中,也可找到之前的修改后的内核分区大小为4M
制作内核补丁文件(注意目录的变换)
4.1 将内核中.config文件拷贝为config_ok后,make distclean
4.2 将linux-3.4.2文件夹重命名为linux-3.4.2_tp
mv linux-3.4.2 linux-3.4.2_tp
4.3 解压从网上下载的内核源码
tar xjf linux-3.4.2.tar.bz2
4.4 用diff命令制作内核补丁文件
diff -urN linux-3.4.2 linux-3.4.2_tp > linux-3.4.2_tp.patch
给内核源码打补丁,并编译内核
进入源码解压后的文件夹(/work/system/linux-3.4.2),使用patch命令
patch -p1 < ../linux-3.4.2_tp.patch
cp config_ok .config
make uImage(生成跟之前linux-3.4.2_tp中的uImage一样)
———-2017.12.7