论文部分内容阅读
摘要:本文主要是对基于嵌入式Linux在S3C2410开发板上的移值过程所需要的三个重要文件:BootLoader引导程序uboot、Linux内核的映像文件zImage、根文件系统rootfs的制作过程,以及怎样将这三个文件移植到自己开发板上所涉及到的一些关键环节作了详细的介绍说明。
关键词:BootLoader引导;内核的映像;根文件系统;下载;烧写
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)33-1513-04
The Key Transplant Processes of Embedded Linux System
HE Zhi-hong1,2, HE Wei-min1
(1. East China University of Technology, Fuzhou 344000, China; 2. Sontian Institute of Guangzhou University, Guangzhou 510515, China)
Abstract: This paper mainly refers to three primary files when transplanting a based-Linux embedded system: uboot, zImage and rootfs, how to be done and transplant to our developed board in detail. And it also come to some key steps what our developed board refers to.
Key words: BootLoader guidance; the core image; root file system; downloads; programming
1 引言
嵌入式Linux系统移植的工作能否正常进行以及移植后系统能否正常运行,与移植过程的几个小环节是分不开的。其实我们用于做嵌入式开发的ARM开发板,它们也是一台简单的电脑来的,也具备计算机系统的绝大部分接口。但是,嵌入式开发板上一般都没有提供类似个人电脑(PC机)在主板上的BIOS程序段,那么我们又怎样能使它们的部件运转起来呢?这只能靠我们用户自己去做一个类似BIOS的硬件启动程序,该程序我们称作BootLoader程序;另外就是即便是我们启动了硬件,如何让我们的开发板能够更好地发挥它的功能呢,那就是需要一个类似操作系统的大管家,而嵌入式系统一般来说,在硬件上是比较简单的(考虑到成本),所以,它不会象个人电脑那样有硬盘、光驱、软驱等之类的东西,甚至内存都是比较小的,因此,我们在定制嵌入式操作系统的时候,一般以“够用”为原则,不需要浪费太多的存储空间而节省生产成本,因此就需要对Linux操作系统的内核进行压缩映像,这就是我们说的Linux内核的映像文件。那么在Linux嵌入式系统的移植过程中涉及到三个文件,这三个文件分为:处于最底层的BootLoader引导程序、Linux内核的映像文件、另外就支持用户操作使用的根文件系统。所以,本文从这三个文件的制作过程中谈论我们要注意的关键环节。
2 BootLoader引导程序uboot制作的关键环节
bootloader的两大功能:一是下载功能,既通过网口、串口或者USB口下载文件到RAM中;一是对flash芯片的读写功能。具体来说:当用户输入启动Linux的命令的时候,u-boot会将 kernel 映像(zImage)和从 nand flash 上读到 RAM 空间中,为内核设置启动参数,调用内核,从而启动Linux。
Uboot是严重依依赖于硬件的体系结构的,而我们从网上下载的u-boot源代码只是提供了一种框架结构,如果要制作适合我们自己的开发板的引导程序uboot,必需在它的基础上进行修改。下面介绍uboot制作过程中的关键步骤:
1) 建立适合自己开发板的board平台目录
可以参照board/smdk2410目录,在源码的board下建立自己的平台目录比如:gxy(这是开发板的名称起名叫gxy,可以依自己的喜好随意起),并将board/smdk2410目录中的所有文件拷贝到gxy目录下,将smdk2410.c更名为gxy.c。
2) 用vi修改u-boot顶层目录下的Makefile文件
在u-boot顶层目录下的Makefile文件中找到:
smdk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
在其后面添加:
gxy _config : unconfig
@./mkconfig $(@:_config=) arm arm920t gxy NULL s3c24x0
各项的意思为:arm: CPU的架构(ARCH);arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录;gxy:开发板的型号(BOARD),对应于board/gec2410目录;NULL: 开发者/或经销商(vender);s3c24x0:片上系统(SOC)。
3) 修改board/gxy/Makefile文件
将 OBJS := smdk2410.o flash.o 改为 OBJS := gxy.o flash.o
4) 以include/configs/smdk2410.h文件为蓝本复制一个include/configs/gxy.h文件。
Cp include/configs/smdk2410.h include/configs/gxy.h
5) 修改cpu/arm920t/config.mk文件。
将 PLATFORM_CPPFLAGS =$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改为 PLATFORM_CPPFLAGS =$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu))
6) 在uboot顶层目录中设置交叉编译环境变量后直行编译,执行下列语句:
export PATH=/usr/local/arm/2.95.3/bin:$PATH; make gxy_config; make all ARCH=arm
编译过程如果不出现错误,则可正常生成u-boot.bin了。
3 Linux内核的映像文件zImage制作的关键环节
当把Linux内核文件下载后,制作Linux内核的映像文件zImage需要经过以下几个环节:(假设用的内核版本为Linux2.6.8.1,编译器为ross-3.3.2)
3.1 修改Linux内核顶层下的Makefile文件
修改内核目录树根下的的Makefile,指明体系结构是arm,交叉编译工具是arm-Linux-。找到ARCH和CROSS_COMPILE,修改为:
ARCH ?= arm
CROSS_COMPILE ?= arm-Linux-
3.2 设置flash分区
在arch/arm目录中建立一个mach-gxy的文件夹,并将arch/arm/mach-s3c2410目录下的所有文件及文件夹复制到mach-gxy目录下,并将相应的文件名进行修改。再修改下面三个文件的相关信息:
arch/arm/mach-gxy/devs.c; 指明分区信息
arch/arm/mach-gxy/mach-smdk2410.c; 指定启动时初始化
drivers/mtd/nand/gxy.c; 禁止Flash ECC校验
3.2.1 内存分区信息
内存分区信息如上图,则修改结构体partition_info[]为如下内容:
static struct mtd_partition partition_info[] ={
{ /* 256kB */name: "boot", size: 0x00040000, offset: 0x0, },
{ /*1.75MB */ name: "kernel",size: 0x001C0000, offset: 0x00040000, },
{ /* 30MB */ name: "root", size: 0x01e00000,offset: 0x00200000, },
{ /* 32MB */ name: "user", size: 0x02000000, offset: 0x02000000,}
};
在结构体nandset中添加Nand Flash分区信息:
struct s3c2410_nand_set nandset ={
nr_partitions: 4, /* 指明partition_info中定义的分区数目 */
partitions: partition_info, /* 分区信息表*/}};
在结构体superlpplatform中提供Nand Flash芯片支持,
struct s3c2410_platform_nand superlpplatform={ tacls:0,
twrph0:30,
twrph1:0,
sets:
关键词:BootLoader引导;内核的映像;根文件系统;下载;烧写
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)33-1513-04
The Key Transplant Processes of Embedded Linux System
HE Zhi-hong1,2, HE Wei-min1
(1. East China University of Technology, Fuzhou 344000, China; 2. Sontian Institute of Guangzhou University, Guangzhou 510515, China)
Abstract: This paper mainly refers to three primary files when transplanting a based-Linux embedded system: uboot, zImage and rootfs, how to be done and transplant to our developed board in detail. And it also come to some key steps what our developed board refers to.
Key words: BootLoader guidance; the core image; root file system; downloads; programming
1 引言
嵌入式Linux系统移植的工作能否正常进行以及移植后系统能否正常运行,与移植过程的几个小环节是分不开的。其实我们用于做嵌入式开发的ARM开发板,它们也是一台简单的电脑来的,也具备计算机系统的绝大部分接口。但是,嵌入式开发板上一般都没有提供类似个人电脑(PC机)在主板上的BIOS程序段,那么我们又怎样能使它们的部件运转起来呢?这只能靠我们用户自己去做一个类似BIOS的硬件启动程序,该程序我们称作BootLoader程序;另外就是即便是我们启动了硬件,如何让我们的开发板能够更好地发挥它的功能呢,那就是需要一个类似操作系统的大管家,而嵌入式系统一般来说,在硬件上是比较简单的(考虑到成本),所以,它不会象个人电脑那样有硬盘、光驱、软驱等之类的东西,甚至内存都是比较小的,因此,我们在定制嵌入式操作系统的时候,一般以“够用”为原则,不需要浪费太多的存储空间而节省生产成本,因此就需要对Linux操作系统的内核进行压缩映像,这就是我们说的Linux内核的映像文件。那么在Linux嵌入式系统的移植过程中涉及到三个文件,这三个文件分为:处于最底层的BootLoader引导程序、Linux内核的映像文件、另外就支持用户操作使用的根文件系统。所以,本文从这三个文件的制作过程中谈论我们要注意的关键环节。
2 BootLoader引导程序uboot制作的关键环节
bootloader的两大功能:一是下载功能,既通过网口、串口或者USB口下载文件到RAM中;一是对flash芯片的读写功能。具体来说:当用户输入启动Linux的命令的时候,u-boot会将 kernel 映像(zImage)和从 nand flash 上读到 RAM 空间中,为内核设置启动参数,调用内核,从而启动Linux。
Uboot是严重依依赖于硬件的体系结构的,而我们从网上下载的u-boot源代码只是提供了一种框架结构,如果要制作适合我们自己的开发板的引导程序uboot,必需在它的基础上进行修改。下面介绍uboot制作过程中的关键步骤:
1) 建立适合自己开发板的board平台目录
可以参照board/smdk2410目录,在源码的board下建立自己的平台目录比如:gxy(这是开发板的名称起名叫gxy,可以依自己的喜好随意起),并将board/smdk2410目录中的所有文件拷贝到gxy目录下,将smdk2410.c更名为gxy.c。
2) 用vi修改u-boot顶层目录下的Makefile文件
在u-boot顶层目录下的Makefile文件中找到:
smdk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
在其后面添加:
gxy _config : unconfig
@./mkconfig $(@:_config=) arm arm920t gxy NULL s3c24x0
各项的意思为:arm: CPU的架构(ARCH);arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录;gxy:开发板的型号(BOARD),对应于board/gec2410目录;NULL: 开发者/或经销商(vender);s3c24x0:片上系统(SOC)。
3) 修改board/gxy/Makefile文件
将 OBJS := smdk2410.o flash.o 改为 OBJS := gxy.o flash.o
4) 以include/configs/smdk2410.h文件为蓝本复制一个include/configs/gxy.h文件。
Cp include/configs/smdk2410.h include/configs/gxy.h
5) 修改cpu/arm920t/config.mk文件。
将 PLATFORM_CPPFLAGS =$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改为 PLATFORM_CPPFLAGS =$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu))
6) 在uboot顶层目录中设置交叉编译环境变量后直行编译,执行下列语句:
export PATH=/usr/local/arm/2.95.3/bin:$PATH; make gxy_config; make all ARCH=arm
编译过程如果不出现错误,则可正常生成u-boot.bin了。
3 Linux内核的映像文件zImage制作的关键环节
当把Linux内核文件下载后,制作Linux内核的映像文件zImage需要经过以下几个环节:(假设用的内核版本为Linux2.6.8.1,编译器为ross-3.3.2)
3.1 修改Linux内核顶层下的Makefile文件
修改内核目录树根下的的Makefile,指明体系结构是arm,交叉编译工具是arm-Linux-。找到ARCH和CROSS_COMPILE,修改为:
ARCH ?= arm
CROSS_COMPILE ?= arm-Linux-
3.2 设置flash分区
在arch/arm目录中建立一个mach-gxy的文件夹,并将arch/arm/mach-s3c2410目录下的所有文件及文件夹复制到mach-gxy目录下,并将相应的文件名进行修改。再修改下面三个文件的相关信息:
arch/arm/mach-gxy/devs.c; 指明分区信息
arch/arm/mach-gxy/mach-smdk2410.c; 指定启动时初始化
drivers/mtd/nand/gxy.c; 禁止Flash ECC校验
3.2.1 内存分区信息
内存分区信息如上图,则修改结构体partition_info[]为如下内容:
static struct mtd_partition partition_info[] ={
{ /* 256kB */name: "boot", size: 0x00040000, offset: 0x0, },
{ /*1.75MB */ name: "kernel",size: 0x001C0000, offset: 0x00040000, },
{ /* 30MB */ name: "root", size: 0x01e00000,offset: 0x00200000, },
{ /* 32MB */ name: "user", size: 0x02000000, offset: 0x02000000,}
};
在结构体nandset中添加Nand Flash分区信息:
struct s3c2410_nand_set nandset ={
nr_partitions: 4, /* 指明partition_info中定义的分区数目 */
partitions: partition_info, /* 分区信息表*/}};
在结构体superlpplatform中提供Nand Flash芯片支持,
struct s3c2410_platform_nand superlpplatform={ tacls:0,
twrph0:30,
twrph1:0,
sets: