ARM的嵌入式Linux移植体验之操作系统.doc
《ARM的嵌入式Linux移植体验之操作系统.doc》由会员分享,可在线阅读,更多相关《ARM的嵌入式Linux移植体验之操作系统.doc(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ARM的嵌入式Linux移植体验之操作系统在笔者撰写的C语言嵌入式系统编程修炼之道一文中,主要陈诉的软件架构是单任务无操作系统平台的,而本文的侧重点则在于讲述操作系统嵌入的软件架构,二者的区别如下图:嵌入式操作系统并不总是必须的,因为程序完全可以在裸板上运行。尽管如此,但对于复杂的系统,为使其具有任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理和中断处理的能力,提供多任务处理,更好的分配系统资源的功能,很有必要针对特定的硬件平台和实际应用移植操作系统。鉴于Linux的源代码开放性,它成为嵌入式操作系统领域的很好选择。国内外许多知名大学、公司、研究机构都加入了嵌
2、入式Linux的研究行列,推出了一些著名的版本:RT-Linux提供了一个精巧的实时内核,把标准的Linux核心作为实时核心的一个进程同用户的实时进程一起调度。RT-Linux已成功地应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像处理等广泛的应用领域。如NASA(美国国家宇航局)将装有RT-Linux的设备放在飞机上,以测量Georage咫风的风速;uCLinux(Micro-Control-Linux,u表示Micro,C表示Control)去掉了MMU(内存管理)功能,应用于没有虚拟内存管理的微处理器/微控制器,它已经被成功地移植到了很多平台上。本章涉及的mizi-linux由韩
3、国mizi公司根据Linux 2.4内核移植而来,支持S3C2410A处理器。1.Linux内核要点和其他操作系统一样,Linux包含进程调度与进程间通信(IPC)、内存管理(MMU)、虚拟文件系统(VFS)、网络接口等,下图给出了Linux的组成及其关系:Linux内核源代码包括多个目录:(1)arch:包括硬件特定的内核代码,如arm、mips、i386等;(2)drivers:包含硬件驱动代码,如char、cdrom、scsi、mtd等;(3)include:通用头文件及针对不同平台特定的头文件,如asm-i386、asm-arm等;(4)init:内核初始化代码;(5)ipc:进程间通
4、信代码;(6)kernel:内核核心代码;(7)mm:内存管理代码;(8)net:与网络协议栈相关的代码,如ipv4、ipv6、ethernet等;(9)fs:文件系统相关代码,如nfs、vfat等;(10)lib:库文件,与平台无关的strlen、strcpy等,如在string.c中包含:char * strcpy(char * dest,const char *src)char *tmp = dest; while (*dest+ = *src+) != )/* nothing */;return tmp;(11)Documentation:文档在Linux内核的实现中,有一些数据结构使
5、用非常频繁,对研读内核的人来说至为关键,它们是: 1.task_structLinux内核利用task_struct数据结构代表一个进程,用task_struct指针形成一个task数组。当建立新进程的时候,Linux为新的进程分配一个task_struct结构,然后将指针保存在task数组中。调度程序维护current指针,它指向当前正在运行的进程。2.mm_struct每个进程的虚拟内存由mm_struct结构代表。该结构中包含了一组指向vm-area_struct结构的指针,vm-area_struct结构描述了虚拟内存的一个区域。3.inodeLinux虚拟文件系统中的文件、目录等均由
6、对应的索引节点(inode)代表。2.Linux移植项目mizi-linux已经根据Linux 2.4内核针对S3C2410A这一芯片进行了有针对性的移植工作,包括:(1)修改根目录下的Makefile文件a.指定目标平台为ARM:#ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)ARCH := armb.指定交叉编译器:CROSS_COMPILE = arm-linux-(2)修改arch目录中的文件根据本章第一节可知,Linux的arch目录
7、存放硬件相关的内核代码,因此,在Linux内核中增加对S3C2410的支持,最主要就是要修改arch目录中的文件。a.在arch/arm/Makefile文件中加入:ifeq ($(CONFIG_ARCH_S3C2410),y)TEXTADDR = 0xC0008000MACHINE = s3c2410Endifb.在archarmconfig.in文件中加入:if $CONFIG_ARCH_S3C2410 = y ; thencomment S3C2410 Implementationdep_bool SMDK (MERI TECH BOARD) CONFIG_S3C2410_SMDK $C
8、ONFIG_ARCH_S3C2410dep_bool change AIJI CONFIG_SMDK_AIJIdep_tristate S3C2410 USB function support CONFIG_S3C2410_USB $CONFIG_ARCH_S3C2100dep_tristate Support for S3C2410 USB character device emulation CONFIG_S3C2410_USB_CHAR $CONFIG_S3C2410_USBfi # /* CONFIG_ARCH_S3C2410 */archarmconfig.in文件还有几处针对S3C
9、2410的修改。c.在arch/arm/boot/Makefile文件中加入:ifeq ($(CONFIG_ARCH_S3C2410),y)ZTEXTADDR = 0x30008000ZRELADDR = 0x30008000endifd.在linux/arch/arm/boot/compressed/Makefile文件中加入:ifeq ($(CONFIG_ARCH_S3C2410),y)OBJS += head-s3c2410.oendif加入的结果是head-s3c2410.S文件被编译为head-s3c2410.o。e.加入archarmbootcompressed head-s3c2
10、410.S文件#include #include #include .section .start, #alloc, #execinstr_S3C2410_start: Preserve r8/r7 i.e. kernel entry values What is it? Nandy Data cache, Intstruction cache, MMU might be active. Be sure to flush kernel binary out of the cache, whatever state it is, before it is turned off. This is
11、done by fetching through currently executed memory to be sure we hit the same cachebic r2, pc, #0x1fadd r3, r2, #0x4000 16 kb is quite enough.1: ldr r0, r2, #32teq r2, r3bne 1bmcr p15, 0, r0, c7, c10, 4 drain WBmcr p15, 0, r0, c7, c7, 0 flush I & D caches#if 0 disabling MMU and cachesmrc p15, 0, r0,
12、 c1, c0, 0 read control registerbic r0, r0, #0x05 disable D cache and MMUbic r0, r0, #1000 disable I cachemcr p15, 0, r0, c1, c0, 0#endif/* Pause for a short time so that we give enough time* for the host to start a terminal up.*/mov r0, #0x002000001: subs r0, r0, #1bne 1b该文件中的汇编代码完成S3C2410特定硬件相关的初始
13、化。f.在archarmdef-configs目录中增加配置文件g.在archarmkernelMakefile中增加对S3C2410的支持no-irq-arch := $(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X) $(CONFIG_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110) $(CONFIG_ARCH_SA1100) $(CONFIG_ARCH_CAMELOT) $(CONFIG_ARCH_S3C2400) $(CONFIG_ARCH_S3C2410) $(CONFIG_ARCH_MX1ADS) $(CONFIG
14、_ARCH_PXA)obj-$(CONFIG_MIZI) += event.oobj-$(CONFIG_APM) += apm2.oh.修改arch/arm/kernel/debug-armv.S文件,在适当的位置增加如下关于S3C2410的代码:#elif defined(CONFIG_ARCH_S3C2410).macro addruart,rxmrc p15, 0, rx, c1, c0tst rx, #1 MMU enabled ?moveq rx, #0x50000000 physical base addressmovne rx, #0xf0000000 virtual addre
15、ss.endm.macro senduart,rd,rxstr rd, rx, #0x20 UTXH.endm.macro waituart,rd,rx.endm.macro busyuart,rd,rx1001: ldr rd, rx, #0x10 read UTRSTATtst rd, #1 i.修改arch/arm/kernel/setup.c文件此文件中的setup_arch非常关键,用来完成与体系结构相关的初始化:void _init setup_arch(char *cmdline_p)struct tag *tags = NULL;struct machine_desc *mde
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 嵌入式 Linux 移植 体验 操作系统
限制150内