最近开始正式开始linux内核的移植工作,开发板为Mini2440,看着文档很简单,但是自己操作起来却是一大堆的问题,2天的时间都花在上面了,但是收获还是很多的,在不断的修改中,开始对内核的工作有了基本的认识,大部分操作是根据网络教程来的,有些配置还是不懂,不过移植成功就是一个好的开端。
首先linux内核移植到开发板上,注重的是与硬件有关的代码,与硬件无关的代码几乎不需要什么改动,在刚开始的移植中除却驱动的移植。我个人的linux移植工作限定于:基本的可使用设备:串口,Nandflash可用,网卡可用(在烧内核时或者后面的文件系统可通过nfs挂在,或tftp)
现在归纳下移植的步骤(前面的解压和安装交叉编译环境就不在提了):
1、添加对ARM的支持,设置好编译器
修改顶层Makefile
# vim Makefile
ARCH ?= arm
CROSS_COMPILE ?=arm-linux-
2.修改机器码
vim arch/arm/tools/mach-types
在379行 s3c2440 ARCH_S3C2440 S3C2440 362
将机器码修改为1999,因为友善的板子机器码是1999,在u-boot的设定中为1999,如果二者不通的话极可能就开在进入内核的地方
(如下所示)
NOW, Booting Linux......
Uncompressing Linux........................................................................................................ done, booting the kernel.
3.修改平台的时钟
vim arch/arm/mach-s3c2440/mach-smdk2440.c
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
//s3c24xx_init_clocks(16934400);
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs);
}
4.Nandflash 分区
在这里吃了不少的苦头,一直没能显示分区,应为一开始并不是直接使用s3c2410_defconfig的配置内核,导致内核配置中关于一些MTD配置出错,所以一直开在这,看不到分区信息,这里的分区信息要看你的开发板Nandflash的情况了,友善的板子可以通过part show来查看
# vim arch/arm/plat-s3c24xx/common-smdk.c
static struct mtd_partition mini2440_default_nand_part[] = {
[0] = {
.name = "supervivi", ;这里是 bootloader 所在的分区,可以放置 u-boot, supervivi 等内容,对应
/dev/mtdblock0
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param", ;这里是 supervivi 的参数区,其实也属于 bootloader 的一部分,如果 u-boot 比较
大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "Kernel", ;内核所在的分区,大小为 5M,足够放下大部分自己定制的巨型内核了,比如内核
使用了更大的 Linux Logo 图片等,对应/dev/mtdblock2
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root", ;文件系统分区,友善之臂主要用来存放 yaffs2 文件系统内容,对应/dev/mtdblock3
.offset = 0x00560000,
.size = 1024 * 1024 * 1024, //
},
[4] = {
.name = "nand", ;此区域代表了整片的 nand flash,主要是预留使用,比如以后可以通过应用程序访
问读取/dev/mtdblock4 就能实现备份整片 nand flash 了。
.offset = 0x00000000,
.size = 1024 * 1024 * 1024, //
}
};
5.配置内核
到这里也是很重要的一步了,内核的配置也决定编译后的内核在开发板上运行的情况
这里我们套用s3c2410的配置,可以用make menuconfig 它是一个图形化的内核配置界面,它会加载.config的文件的配置,可以大大简化我们的配置过程,只需要稍加改动即可.采用S3C2410_defconfig,你需要执行的是 make S3C_2410_defconfig (这样他做的就是将arch/arm/configs中的s3c2410_defconfig复制到源码根目录下为.config文件,这里涉及到一个规范问题,最好不要直接复制改名,当然也不是不可以,详细的可以参考内核文档)。
这里我们做以下内容添加
System Type---> S3C2410 Machines --->[*] SMDK2410/A9M2410
S3C2440 Machines --->[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module
内核特性加上以下两项:
Kernel Features --->[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this(EXPERIMENTA) kernel
6、make zImage
等待生成内核映像文件,至此linux内核移植工作基本结束。此时还没见天文件的支持,如果你有想成的根文件系统,就可以配置的 File systems。