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/下载其他版本内核。

 

Linux内核移植Linux内核移植

Linux内核移植

 

2. 解压linux内核

 

2.1.把下载好的linux-3.6.9内核拷贝到Windows下的共享目录,再拷贝到linux(Ubuntu)的一个目录下。

Linux内核移植

2.2使用命令tar  xjvf linux-3.6.9.tar.bz2 解压内核

Linux内核移植

解压成功后,在当前目录下出现一个linux-3.6.9目录(如下图)

Linux内核移植

 

3. 移植过程

 

3.1.修改顶层Makefile,指定编译器

进入linux-3.6.9目录

Linux内核移植

sudo vim Makefile

把ARCH ?= $(SUBARCH)和CROSS_COMPILE?= $(CONFIG_CROSS_COMPILE:"%"=%)分别修改为ARCH ?= arm  和CROSS_COMPILE ?= arm-linux-

Linux内核移植Linux内核移植转存失败重新上传取消Linux内核移植

Linux内核移植

保存完之后,退出,使用默认配置make mini2440_defconfig一下。

3.2.修改MTD分区表

修改MTD分区表要跟u-boot中MTD分区表一致,否则会启动不了内核。

 vim  arch/arm/mach-s3c24xx/mach-mini2440.c,修改如下图

Linux内核移植

 

3.3.支持LCD驱动

把文档目录下的mini2440fb.c放到linux的共享目录下,再拷贝到drivers/video/下

Linux内核移植

cp /mnt/hgfs/Share/MINI2440/ mini2440fb.c  drivers/video/

Linux内核移植

修改drivers/video目录下的Makefile

vim drivers/video/Makefile

Linux内核移植

 

3.4.移植yaffs2文件系统

所谓移植移植 yaffs2 文件系统实际上就是向linux 内核添加 yaffs2 文件系统。

3.4.1.下载yaffs2文件系统

下载yaffs2文件系统的链接:

http://www.aleph1.co.uk/gitweb?p=yaffs2.git;a=shortlog

把下载好的yaffs2文件系统拷贝到共享目录,再拷贝到linux的一个目录下

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内核移植

打完补丁,回到linux内核目录

cd /home/sun/work/linux/linux-3.6.9/

3.4.3.配置内核

make menuconfig

Linux内核移植

注意:此版本的yaffs2文件系统在linux-4.8.0以下版本会出现挂载不了nand flash上的根文件系统问题。具体可以查看https://blog.****.net/Blazar/article/details/79247464中文章介绍。做如下修改,就可以解决这个问题。

解决方法:

1.修改fs/yaffs2/yaffs_vfs.c,搜索yaffs_getxattr,做如下修改(如下图)

Linux内核移植

2.修改fs/yaffs2/ yaffs_guts.c,搜索yaffs_get_obj_name函数,做如下修改(如下图)

Linux内核移植

 

3.5.裁剪内核

执行make menuconfig ,出现如下图的错误

Linux内核移植

解决方法:

sudo apt-get install ncurses-dev

Linux内核移植

安装ncurses-dev之后,重新make menuconfig,就可以看到这样的界面(如下图):

Linux内核移植

现在就可以通过界面来裁剪内核,具体的操作如下:

a.去掉不需要支持的单板

Linux内核移植

b.裁剪对文件系统的支持

Linux内核移植

c.裁剪对驱动的支持

Linux内核移植

 

4.编译下载

 

4.1.编译

make uImage

执行make uImage编译内核时,出现了一个错误(如下图)

Linux内核移植

上图出现错误的原因是:由于编译内核生成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

Linux内核移植

安装u-boot-tools工具之后,重新make uImage,编译成功(如下图)

Linux内核移植

 

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内核移植

重启开发板,linux系统就可以跑起来了,屏幕上,但由于nandflash中缺少根文件系统,linux加载不了会出错(如下图),后续会有一篇文章来介绍怎么样移植根文件系统。

Linux内核移植