嵌入式 Linux 操作系统的
移植与研究
一.概述
嵌入式系统一般定义为:以应用为中心,以计算机技术为基础,软硬件可剪裁,适应
应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。简言之,一个嵌
入式系统就是一个计算机硬件和软件的
集合体。S3C2440是SAMSUNG公司使用ARM920T处理器内核开发的一款嵌入式处理器,专门为
PDA、INTERNET设备、手持设备等开发,S3C2440和它的前身$3C2410相比,除了具有宽温的
特性和两倍的运行速度以外,还具备了AC97编码器、摄像模块(标准CCD或CMOS)接口、驱动
强度控制等功能,它是真正的工业级芯片,配合14 minx 14 mm的小体积,可以适合多数嵌
入式场合使用。Linux是开放源代码的操作系统。
嵌入式Linux是按照嵌入式操作系统的要求设计的一种小型操作系统,由一个内核以
及一些根据需要进行定制的系统模块组成。其内核很小,一般只有几百kbyte,它非常适合
移植到嵌入式系统中去,同时它还具有多用户多任务的系统特征,有些还具有实时特征。本
文从以下三个方面系统介绍如何搭建一个基于Linux-2.6.23.14内核的小型Linux操作系
统,并将它移植到$3C2440开发板上。
二.系统总体设计
1.VIVI 移植。
2. linux 内核移植。
3. DM9000网卡驱动移植。
4.交叉编译 busybox。
5.执行 make CONFIG_PREFIX=/2440/rootfs install。
6.NFS 文件系统 client 端设置。
7.构建其他目录。
8.使用 mkyaffsimgae 命令生成 yaffs 映像文件。
9.通过 supervivi 将内核映像 zImage 和 rootfs.yaffs 下载到开发板上。
1
三. 系统实现:
1.VIVI 移植
在移植 VIVI 之前,必须先保证交叉编译器的正确性。在 VIVI 和 kernel 的 Makefile 中需要
指定交叉编译器的位置,所以在正式移植以前先把交叉编译器 copy 到指定的位置
/usr/local/arm/…
1.1 修改 Makefile 文件
Makefile 中主要修要修改三处:
1. LINUX_INCLUDE_DIR
设置为 LINUX_INCLUDE_DIR =
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
2. CROSS_COMPILE
设置为 CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux-
3. ARM_GCC_LIBS
设置为 ARM_GCC_LIBS =
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
1.2 修改 arch/s3c2440/smdk.c
Smdk.c 是 VIVI 移植中最重要的一个文件,主要是分区表的建立和启动参数的设置
1. 分区表的建立
将 s3c2440_NAND_BOOT 时对应的分区数据结构修改为如下结构
#ifdef CONFIG_S3C2440_NAND_BOOT
mtd_partition_t default_mtd_partitions[] = {
{
2
/*
add by xwc
2010-04-15
*/
name: "supervivi",
offset: 0,
size: 0x00030000,
flag: 0
}, {
name: "kernel",
offset: 0x00050000,
size: 0x00200000,
flag: 0
}, {
name: "root",
offset: 0x00250000,
size: 0x03Dac000,
flag: 0
}
};
#endif
3
2. 启动参数的设置
启动参数主要是指这一行
char linux_cmd[] = "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0";
在我最开始做实验的时候,因为不知道 param save 无法保存的 bug 是怎么回事(详见下
文),所以选择在代码里修改,之后解决了那个问题,就选择用默认的参数,在启动的时候
可以手动设置。
1.3 配置选项
主要是用 make menuconfig 的方式对 VIV 进行配置,不过一般在 make menuconfig 之前最
好先执行 make distclean 确保系统处于 clean 的状态,不然有时候会无法生成 config 界
面
各个部分大致做的工作如下
System Type ---> [系统配置:主要设置芯片、平台类型 底层启动选项等]
General setup---> [通用设置:vivi 基地址、系统缓存、电源管理等 ]
Private Data ---> [私有数据设置:vivi 的私有数据 启动的一些用户私有数据]
Serial Port ---> [串口:是否支持串口(vivi 只支持串口,怎么敢不选),串口传输协议]
Memory Technology Devices(MTD)--> [存储设备相关选项]
Add Built-in Commands ----> [vivi 支持命令]
System hacking ----> [系统调试相关选项]
Debugging messages ---> [调试信息相关]
----
Load and Alternate Configuration File [载入配置文件,vivi 自带一个 sdmk 的配置文
件]
Save Configuration to an Alternate File [保存自己的配置信息]
4
有如下几个地方需要注意:
System type 要选对,而且要保证支持 NAND 启动方式
I-cache D-cache 要选中,要不然启动很慢
要启动串口支持
1.4 做实验过程中遇到的问题
VIVI 的移植相对而言很简单,最开始在 make menuconfig 的时候没有编辑界面跳出来,不
过我平时弄 linux-kernel 比较多,linux kernel menuconfig 的时候有时也会报错,主要
是因为以前编辑过,有些残留的文件,要清除掉才可以,于是打开 Makefile 文件,查找果
然有 distclean:
clean:
find . \( -name '*.o' -o -name core -o -name ".*.flags" \) -type f -print \
| grep -v lxdialog/ | xargs rm -f
rm -f $(CLEAN_FILES)
distclean: clean
于是我就知道肯定是要先 make distclean 一下。
还有一个问题就是 mach_type, 这里经过我的研究,发现只要 linux kernel 和 vivi 中对应
就可以了,不修改也是没有问题的,所以我选择了不修改。
2. linux 内核移植
内核的移植其实本质上跟 VIVI 差不多,主要是做一些配置,一是使用 gcc-arm 交叉编译器,
二是与 vivi 上的分区表保持一致。
2.1修改 Makefile
主要是修改成使用 arm-gcc 交叉编译器进行编译,下面是我 makefile 中修改的地方
第一处:
5
#========================================================================
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
# -e s/arm.*/arm/ -e s/sa110/arm/ \
# -e s/s390x/s390/ -e s/parisc64/parisc/ \
# -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
# -e s/sh.*/sh/ )
#========================================================================
# add by xwc
# 2010-4-15
SUBARCH := arm
#========================================================================
第二处:
#===============================
#CROSS_COMPILE ?=
#==============================
# add by xwc
# 2010-4-15
CROSS_COMPILE ?= arm-linux-
#==============================
2.2 ~/.bashrc 修改
为了能够更方便的使用 arm-gcc 交叉编译器,将其加入到 Path 中,可以利用修改.bashrc
的方式:
6
export PATH=$PATH:/usr/local/arm/4.3.2/bin
然后 source .bashrc 一下,或者重新登录就可以了。这样就没有必要再 Makefile 中指定
全局的路径。
2.3 时钟配置
对应于 arch/arm/mach-s3c2440/mach-smdk2440.c
将
S3c24xx_init_clocks(16934400);
改为:
S3c24xx_init_clocks(12000000);
2.4 分区信息修改
分区的信息要保持跟 VIVI 中一致,其实理论上说,不保持一致也是 OK 的,不过为了防止意
外,最好还是 copy 一下。
修改 arch/arm/plat-s3c24xx/common-smdk.c 文件
static struct mtd_partition smdk_default_nand_part[] = {
/*
add by xwc
2010-04-15
*/
[0] = {
.name = "supervivi",
.size = 0x00030000,
.offset = 0,
7