首次linux内核移植

时间:2021-11-17 16:29:16

最近开始正式开始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。