Linux内核移植
文章基于mini2440开发板和linux-3.6.9来介绍Linux内核移植过程。交叉编译器为 arm-linux-gcc-4.4.3。
自Linux2.6.31开始,Linux内核已经开始官方支持了Mini2440,所以在这个版本只需要修改一些关键的配置就可以成功移植,不需向Linux2.6.31之前的版本一样构造mini2440开发板相关的文件。
1.Linux内核下载
linux-3.6.9内核下载地址:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.6.9.tar.bz2 ,也可以到linux网站 http://www.kernel.org/下载其他版本内核。
2. 解压linux内核
2.1.把下载好的linux-3.6.9内核拷贝到Windows下的共享目录,再拷贝到linux(Ubuntu)的一个目录下。
2.2使用命令tar xjvf linux-3.6.9.tar.bz2 解压内核
解压成功后,在当前目录下出现一个linux-3.6.9目录(如下图)
3. 移植过程
3.1.修改顶层Makefile,指定编译器
进入linux-3.6.9目录
sudo vim Makefile
把ARCH ?= $(SUBARCH)和CROSS_COMPILE?= $(CONFIG_CROSS_COMPILE:"%"=%)分别修改为ARCH ?= arm 和CROSS_COMPILE ?= arm-linux-
保存完之后,退出,使用默认配置make mini2440_defconfig一下。
3.2.修改MTD分区表
修改MTD分区表要跟u-boot中MTD分区表一致,否则会启动不了内核。
vim arch/arm/mach-s3c24xx/mach-mini2440.c,修改如下图
3.3.支持LCD驱动
把文档目录下的mini2440fb.c放到linux的共享目录下,再拷贝到drivers/video/下
cp /mnt/hgfs/Share/MINI2440/ mini2440fb.c drivers/video/
修改drivers/video目录下的Makefile
vim drivers/video/Makefile
3.4.移植yaffs2文件系统
所谓移植移植 yaffs2 文件系统实际上就是向linux 内核添加 yaffs2 文件系统。
3.4.1.下载yaffs2文件系统
下载yaffs2文件系统的链接:
http://www.aleph1.co.uk/gitweb?p=yaffs2.git;a=shortlog
把下载好的yaffs2文件系统拷贝到共享目录,再拷贝到linux的一个目录下
3.4.2.解压yaffs2文件系统
tar -xzvf yaffs2-3439fa4.tar.gz
3.4.3.添加yaffs2源文件到linux内核(给linux内核打补丁)
cd yaffs2-3439fa4/
./patch-ker.sh c m /home/sun/work/linux/linux-3.6.9/
打完补丁,回到linux内核目录
cd /home/sun/work/linux/linux-3.6.9/
3.4.3.配置内核
make menuconfig
注意:此版本的yaffs2文件系统在linux-4.8.0以下版本会出现挂载不了nand flash上的根文件系统问题。具体可以查看https://blog.****.net/Blazar/article/details/79247464中文章介绍。做如下修改,就可以解决这个问题。
解决方法:
1.修改fs/yaffs2/yaffs_vfs.c,搜索yaffs_getxattr,做如下修改(如下图)
2.修改fs/yaffs2/ yaffs_guts.c,搜索yaffs_get_obj_name函数,做如下修改(如下图)
3.5.裁剪内核
执行make menuconfig ,出现如下图的错误
解决方法:
sudo apt-get install ncurses-dev
安装ncurses-dev之后,重新make menuconfig,就可以看到这样的界面(如下图):
现在就可以通过界面来裁剪内核,具体的操作如下:
a.去掉不需要支持的单板
b.裁剪对文件系统的支持
c.裁剪对驱动的支持
4.编译下载
4.1.编译
make uImage
执行make uImage编译内核时,出现了一个错误(如下图)
上图出现错误的原因是:由于编译内核生成uImage的时候,找不到 mkimage这个命令。
解决错误的方法(有两种,选其中一种就可以):
1.把uboot源码编译后把tools目录下的mkimage文件拷贝到系统的可执行命令文件夹内也就是 cp u-boot/u-boot-2016.07/tools/mkimage /usr/bin(注意:mkimage是编译uboot之后生成的,并不是mkimage.c之类的文件)
2.安装Ubuntu提供的工具包,这种方法比较便捷,执行命令sudo apt-get install u-boot-tools
安装u-boot-tools工具之后,重新make uImage,编译成功(如下图)
4.2.下载
打开tftpboot工具把uImage-3.6.9下载到板子
tftp 32000000 uImage-3.6.9 //把uImage-3.6.9文件下载到内存0x32000000地址
擦除kernel分区
nand erase.part kernel
烧写uImage-3.6.9文件
nand write 0x32000000 0x80000 0x 23d7e0(0x32000000:存放下载文件的内存地址,0x80000:要烧写的起始地址,0x 23d7e0:文件大小)
重启开发板,linux系统就可以跑起来了,屏幕上,但由于nandflash中缺少根文件系统,linux加载不了会出错(如下图),后续会有一篇文章来介绍怎么样移植根文件系统。
完