移植标准Linux到S3C2410
1 引言
目前 , 在嵌入式系统里基于ARM核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用 , 建立面向ARM构架的嵌入式操作系统也就成为当前研究的热点。S3C2410是SAMSUNG公司基于ARM920T处理器内核开发的一款16/32位嵌入式处理器,运行频率高达200多M,具有MMU和高速缓存等丰富片上资源,是目前基于ARM920T内核的出货量最大的一款芯片。目前嵌入式操作系统也较多,如 Tor2nado 的VxWork、微软的 Windows CE等等。大量开发人员选择的却都是Linux,这是因为它源代码开放,可以轻松修改移植到自己的目标平台系统里使用。并且事实证明,效果令人满意。两者的结合必将在嵌入式系统的世界里打出一片天地。
2 Linux 操作系统的移植
2.1移植的含义
要使得标准Linux能在ARM嵌入式处理器上运作,势必要经过移植 (porting) 的过程。所谓移植,就是让一套软件可以在一套选定硬件平台上正常运作,也就是要将平台相依 (platform dependent) 的部分做适当的修改。内核源码arch子目录包括了所有和平台体系结构相关的核心代码,它的每一个子目录都代表所支持的一种体系结构,arm就是关于我们所选处理器体系结构的子目录。我们的移植工作主要集中于此目录下。
2.2移植的具体实现
如果我们已经搭建起完整的交叉编译平台,移植工作便可开始了(以当前使用最广的linux-2.4为例,放于/usr/src/ linux-2.4.18之下)。
/ Makefile文件
一个工程往往包含很多的文件,按照一定的规则放在多个目录中。Makefile文件用来指定编译规则,例如哪些需要编译,哪些要先编译。在此处要做的是:
指定目标平台ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
设置为ARCH :=arm
指定交叉编译器CROSS_COMPILE =
设置为CROSS_COMPILE =arm-linux-
/arch/arm/Makefile
启动代码的产生要通过此一文件,由于2.4内核还没有对S3C2410的支持,自行加入如下代码
ifeq ((CONFIG_ARCH_ S3C2410),y)
TEXTADDR = xxx
MACHINE = s3c2410
Endif
TEXTADDR是内核的虚拟起始地址[6],也是内核最终运行地址,通常设为PAGE_OFFSET +0x8000,须根据实际情况相结合[2]。
/arch/arm/config.in
config.in是配置文件,决定了我们在配置菜单中看到的内容。自行加入$CONFIG_ARCH_S3C2410子选项[5]。
if [ $CONFIG_ARCH_S3C2410 = y ]; then
comment'Archimedes/A5000 Implementations'
dep_bool 'SMDK (MERI TECH BOARD) '
CONFIG _S3C2410_SMDK//
$CONFIG_ARCH_S3C2410
//其他
fi
在if [ $CONFIG_FOOTBRIDGE_HOST = y -o
……
$CONFIG_ARCH_SA1100 = y ]; then
define_bool CONFIG_ISA y
else
define_bool CONFIG_ISA n
fi
中依样加入$CONFIG_ARCH_s3c2410 = y-o。
/arch/arm/boot/Makefile
ZTEXTADDR 是解压前image.rom的位置,ZRELADDR是内核解压并最终执行的位置。ZRELADDR与TEXTADDR之间符合如下映射关系:__virt_to_phys(TEXTADDR) == ZRELADDR[6]。
ifeq ((CONFIG_ARCH_s3c2410),y)
ZTEXTADDR = xxx
ZRELADDR = xxx
Endif
/arch/arm/boot/compressed/ Makefile
依样加入 ifeq ($(CONFIG_ARCH_S3C2410),y)
OBJS +=head-s3c2410.o
endif
/arch/arm/boot/compressed/head-s3c2410.s
此处需要自行加入内核解压前处理器初始化文件head-s3c2410.s,示例代码:
.section .start, ax
__S3C2410_start:
bic r2, pc, #0x1f @清除pc相关位,放于r2
add r3, r2, #0x4000
1: ldr r0, [r2], #32
teq r2, r3
bne 1b
mcr p15, 0, r0, c7, c10, 4 @ 写回 Write Buffer
mcr p15, 0, r0, c7, c7, 0 @ 刷新 I D caches
#if 0
@ 禁用MMU ,caches
……
#endif
mov r0, #0x00200000
1: subs r0, r0, #1
bne 1b
/arch/arm/kernel/ Makefile
依样将$(CONFIG_ARCH_2400) $(CONFIG_ARCH_2410) 加入
no-irq-arch :=$(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X)
……
$(CONFIG_ARCH_AT91RM9200
并添加 obj-$(CONFIG_MIZI) += ecard.o
obj-$(CONFIG_ARCH_APM) +=apm2.o
/arch/arm/kernel/entry-armv.S
此文件主要定义CPU初始化时中断处理部分[6],可参考处理器使用手册,按处理器使用要求设置。
/arch/arm/kernel/debug-armv.S
此文件用于最基本的串口调试功能[6],包括调试串口的地址初始化、发送、等待、忙状态定义等。使用此文件可以在启动过程中打印出相关信息。
/arch/arm/kernel/setup.c
在此文件中要根据使用的板子设置几个变量[5]。nr_banks指定了内存块的数量,bank指定了每块内存块的范围,PAGE_OFFSET是内存起始地
- 基于s3c2410的CramFS根文件系统的移植(07-13)
- AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现(11-06)
- 基于WinCE的ARM视频监控系统(11-14)
- 基于WinCE的I2C驱动程序设计(04-24)
- WinCE下光电编码器的驱动程序设计(04-12)
- 嵌入式Win CE中CAN总线控制器的驱动设计与实现(05-01)