APP下载

基于ARM平台的Linux内核移植研究

2015-01-21沙晓艳肖宁

沙晓艳 肖宁

摘要:以S3C2440(ARM920T核)微处理器为核心,搭建硬件平台,通过对Linux2.6.32.2的源代码结构进行分析,进一步修改和优化内核,同时完成整个移植过程的配置和编译,实现Linux内核成功移植到开发板的实验效果。

关键词:S3C2440  Linux内核  内核移植

0 引言

随着计算机、Internet技术的不断发展,嵌入式系统得到广泛应用,同时嵌入式操作系统逐渐成为其中的重要组成部分。对于嵌入式Linux来说,通过对普通Linux操作系统进行裁剪、修改,通过嵌入的方式,使之运行在计算机系统上[1]。将Linux内核移植到一些典型的微控制器和微处理器上,成为前嵌入式Linux的一个热点应用,通过提供操作系统层面的支持,进一步开发嵌入式系统应用软件。

1 Linux内核结构分析

1.1 Linux内核 Linux内核是Linux操作系统的核心,也是整个Linux功能的体现。Linux内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口、进程间通信[2]。

各个子系统之间的依赖关系如图1所示。

图1  子系统之间的关系

1.2 内核源码 Linux内核源码使用目录树结构,通常位于/usr/src/linux目录中,如图2所示。在Linux的源码根目录下存在大量子目录,分别组织存放各种内核子系统或文件的。其中,arch//目录包括所有和体系结构相关的内核代码;include/asm-/目录包括编译内核所需要的大部分include文件;drivers/中存放各种设备驱动程序;mm/目录包括所有的内存管理代码;kernel/目录中存放Linux内核核心代码;fs/目录包含所有的文件系统代码;init/目录包含内核的初始化代码;ipc/目录包含内核的进程间通信的代码;net/目录包含内核的网络代码。在2.6.32的内核代码中已经完全包含了对S3C2440硬件体系的支持。

2 内核移植过程

内核移植一般包括内核配置、内核编译和内核下载3大部分。

2.1 内核配置 因为2.6.32版本的linux内核已经对S3C2440全系列硬件做了较好的兼容,大部分选项可以使用其缺省值。配置時,主要选择:处理器类型、板级支持、对设备驱动及文件系统的支持。

2.1.1 搭建交叉编译环境。修改源代码根目录下的Makefile,将默认编译平台

Export KBUILD_BUILDHOST:=$(SUBARCH)

ARCH    ?= $(SUBARCH)

CROSS_COMPILE ?=

改为:

Export KBUILD_BUILDHOST:=$(SUBARCH)

ARCH    ?= arm

CROSS_COMPILE ?=arm-linux-

其中,ARCH是指定编译的目标平台为arm,CROSS_COMPILE是指定交叉编译器。如果使用其他的编译环境,则要把编译器的全部路径写出。

2.1.2 设置NAND FLASH 分区。将NAND FLASH分成2个区:Kernel、Rootfs,其中name表示分区的名称,size表示分区的大小,offset表示分区在Flash中的起始地址。代码在arch/arm/plat-s3c24xx/common-smdk.c中,将此结构体中的内容:

static struct mtd_partition smdk_default_nand_part[] = {}

修改为:

static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = "kernel",

.size = SZ_2M,

.offset = 0,

},

[1] = {

.name = "rootfs system",

.offset = SZ_2M,

.size = SZ_64M,

}

};

2.1.3 设置晶振频率

代码在arch/arm/mach-s3c2440/mach-smdk2440.c 中,将代码:

s3c24xx_init_clocks(16934400);

改为:

s3c24xx_init_clocks(12000000);

2.1.4 修改内核配置。在指定交叉编译环境后,输入make menuconfig命令,打开Linux的内核配置界面,如图3所示。针对特定的硬件平台适配内核参数。

图3  内核配置界面

①系统配置

System Type--->

[*]MMU-based Paged Memory Management Support│

ARM system type (Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443) --->

S3C2410 Machines--->

[*]SMDK2440

[*]SMDK2440 with S3C2440 CPU module,其余不选。

②串口驱动

Device Drivers  --->

<*>Memory Technology Device (MTD) support --->                                                          [*]MTD partitioning support ,其余不選。

Device Drivers  --->

Character devices  --->

Serial drivers  --->

<*>Samsung SoC serial support                                                              [*]Support for console on Samsung SoC serial port                                           <*> Samsung S3C2440/S3C2442 Serial port support (NEW)   ,其余不选。

③文件系统

File systems --->

Miscellaneous filesystems--->

<*> Journaling Flash File System v2(JFFS2) support,其余不选。

④内核设置

Kernel Features--->

[*]Use the ARM EABI to compile the kernel,其余不选。

2.2 内核编译 内核的编译一般分为2步:建立内核映像,建立内核模块。在2.6内核中建立内核依赖关系和建立内核是同时完成的。只需:①利用#make uImage命令,生成映像uImage(能被uboot识别的内核镜像(只对于uboot))。②利用#make modules命令,建立内核模块。

2.3 内核移植 一般来说与开发板通信有3种方式:网络下载(tftp,ftp等)、串口下载和USB下载。用tftp下载,需要配置Linux下的tftp服务,然后将PC和开发板直连线(非网线)即可;用串口下载,需要配置Linux下的串口通信工具Minicom,配置的主要是一些重要参数。

实验中,通过tftp将内核直接下载到开发板的内存中。在网络畅通的情况下,执行下面的命令:

# tftp 30000000 uImage

把linux内核下载到开发板的内存的30000000中地址处。

3 内核启动

内核移植后,要使系统正常启动,只有系统内核是不够的,还需要加载文件系统,一般是把现有文件系统加载到目标板,包括制作文件系统镜像和用NFS加载文件系统方法。然后,通过串口线与PC相连,给开发板供电,打开开关,内核就可以加载,如图4所示。

4 总结

本文分析了Linux-2.6.32.2内核源代码,研究了Linux内核移植过程。针对具体硬件设备、文件系统及应用对内核代码做了相应的配置,完成了基于ARM平台的S3C2440处理内核的移植过程,取得了预期的实验结果。

参考文献:

[1]赵小林.嵌入式Linux系统研究与网络设备驱动程序开发[J]. 武汉理工大学,2007.5

[2]刘文,徐磊等.基于ARM平台的Linux内核分析与移植研究[J].现代计算机,2011.04.

[3]何云霞.嵌入式Linux系统移植与实现[J].电子科技大学, 2009.5.

[4]刘洪涛,孙天泽.嵌入式系统技术与设计[M].人民邮电出版社,2009.1.

基金项目:本文系陕西职业技术学院国家骨干院校建设子项

目——计算机应用专业重点课程建设阶段性研究成果。

作者简介:沙晓艳(1972-),女,陕西西安人,陕西职业技术学院副教授,研究方向:教育教学、嵌入式应用;肖宁(1975-),女,陕西西安人,陕西职业技术学院讲师,研究方向:计算机专业教学、智能计算。