基于ARM的嵌入式Linux系统研究与应用_图文

山东大学 硕士学位论文 基于ARM的嵌入式Linux系统研究与应用 姓名:王彦堂 申请学位级别:硕士 专业:控制理论与控制工程 指导教师:李贻斌 20070529

山东大学硕士学位论文





当前,嵌入式系统已经广泛地应用到人们生活的各个领域。同时,随着嵌入 式处理器性能的不断增强,特别是32位高性能嵌入式微处理器的广泛使用,嵌 入式操作系统逐渐成为嵌入式系统中最重要的组成部分。而在各种嵌入式操作系 统中,Linux凭借其代码公开,性能稳定,网络功能强大等多方面的优势,在嵌 入式系统中被广泛地采用,得到了嵌入式系统设计者的普遍认可.研究Linux操 作系统理论,进行嵌入式Linux系统的移植和应用程序的开发,具有重要的理论 意义和现实意义。 研究课题以32位ARM架构的嵌入式处理器¥3C2410A为硬件平台核心, 系统地介绍了¥3C2410A处理器和系统的硬件组成。在此基础上重点研究了嵌入 式Linux系统的构建和移植,其中首先研究了基于Linux的嵌入式交叉开发环境

的构建。之后详细地研究了系统引导程序的原理,分析了系统引导程序ⅥⅥ的
结构并在此基础上实现了vIⅥ的移植。接下来论文研究了ARM Linux内核结构 和启动引导过程,讨论了ARM Linux内核移植及配置编译的具体方法和过程。 作为嵌入式Linux移植的另外一个重点,课题还详细地研究了嵌入式Linux根文 件系统的结构、根文件系统内容的构建以及如何为嵌入式系统进行多文件系统的 选择。在完成Linux内核与文件系统的移植后研究了嵌入式Linux驱动程序的原 理,设计了S3C2410A微处理器扩展CAN总线接口,给出了ARM Linux上CAN 设备驱动程序实现方法。课题最后还研究了嵌入式Linux系统下的图形用户界 面,在分析国内外嵌入式GUI的特点和MiniGUI的技术优势基础上,介绍了为 嵌入式Linux系统配置、编译和安装MiniGUI的方法,而且以一个状态显示界面 程序为实例介绍了MiniGUI程序的设计方法.

关键词:ARM;嵌入式Linux;Boot Loader:内核;MiniGUI

山东大学硕士学位论文

ABSTRACT

Presently,embedded systems a∞widely applied in almost all fields.Mcanwlail磊
with the unceasing enhancement performance of the embedded proe髂sor,especially the wide
use

of the 32 bits microprocessor,embedded operating systems gradually

become the most important constituent of the embedded systems.In all kinds of embedded operating systems,Linux has the
advantage of open source,good

performance,and strong capacity ofnetwork supporting,SO it has been widely used in embedded systems and accepted by the embedded system designers.It is of great
theoretical and practical significance to study the theory ofLinux operating system,to port the embedded Linux system and to develop the application procedure.

The¥3C2410A CPIJ and the

stnleture ofthe

system hardwlu蛤platform al't)firstly
all

introduced in this paper.Based

On

this,the research of this paper is to build

embedded Linux system and port it into the target hardware platform.Firstly,this
paper describes how to establish the
cross

compiling environment.After the rc∞arela

ofthe work principle ofthe embedded boot loader and the analyses ofthe structure of

VI ̄,I,VⅣI has been ported into

the target hardware platform.Based

On

the analyses

of the structure of 1.,inux kernel.the methods of kernel porting and

configuration雠

discussed.Then the building of the content of the Linux root filesystem and the selection ofmuldple type filesystem a他introduced.Atter finishing porting the Linux kernel and file systems,this paper also rcscarclacs the theory of Linux device driver,

introduces the methods ofexpanding CAN bus device on¥3C2410A and presents tho implementation of the CAN device driver.Finally,based
Oil

the introduction of the

teelmique advantage
and installation

of

MiniGUI,this
all

paper studies the configuration,compilation

ofMiniGUI in

embedded Linux system.

Key Words:ARM;Embedded Linux;Boot Loader;Kernel;MiniGUI

II

山东大学硕士学位论文

符号说明
License,通用公共许可证 Computers。精简指令集计算机

GPL IUSC

GNU Public

Reduced Instruction Set

AI蝴
AMBA
ASB APB

Advanced RISC Machines,高级精简指令集计算机 Advanced Microprocessor
Bus

Architecture,高级微处理器总线结构

Advanced System Bus,高级系统总线 Advanced
Peripheral

Bus,高级外设总线

M^n,
LCD

Memory

Management Unit,存储器管理单元 Memory,只读存储器

Liquid Crystal Display,液晶显示屏
Read Only Static

ROM SRAM
CPSR SPSR
DSP BIOS

Random Access Memory,静态随机存储器

Current Program Status Register,当前程序状态寄存器

Saved Program Status Register,备份的程序状态寄存器

Digital

Signal Processor,数字信号处理器

Basic Input Output

System,基本输入/输出系统

MBR

Master Boot Record,主引导记录

MTD
RTOS FHS DOC SoC GUI CAN

Memory Technology Device,存储技术设备
Real Time Operating

System,实时操作系统
Standard,文件系统架构标准

File system Hierarchy Disk On

Chip,片上磁盘

System On Chip,片上系统
Graphical User

Interface,图形用户界面

ControllerAreaNetwork,控制器局域网

Ill

原创性声明
本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独

立进行研究所取得的成果。除文中已经注明引用的内容外,本论文不
包含任何其他个人或集体已经发表或撰写过的科研成果。对本文的研 究作出重要贡献的个人和集体,均已在文中以明确方式标明。本声明

的法律责任由本人承担。

论文作者签名:

墨蒸望

日期:

兰翌j墨兰2

关于学位论文使用授权的声明
本人完全了解山东大学有关保留、使用学位论文的规定,同意学 校保留或向国家有关部门或机构送交论文的复印件和电子版,允许论 文被查阅和借阅;本人授权山东大学可以将本学位论文的全部或部分 内容编入有关数据库进行检索,可以采用影印、缩印或其他复制手段 保存论文和汇编本学位论文。 (保密论文在 论文作者签名: 期:

山东大学硕士学位论文

第一章绪论

1.1课题研究的背景
嵌入式系统是一种以应用为中心,以计算机技术为基础,其软硬件可配置, 可裁减,对功能、可靠性、成本、体积、功耗有严格约束的专用计算机系统。它 结合了先进的计算机技术、半导体技术、电子技术以及各个行业的具体应用,被 看作技术密集、不断创新的知识集成系统。嵌入式系统由硬件和软件两大部分组 成,硬件包括了嵌入式处理器和外围硬件设备,软件一般由嵌入式操作系统和应 用软件组成,嵌入式系统是集软硬件为一体的可以独立完成某具体工作的计算机 系统。随着计算机软件技术的发展和嵌入式处理器性能的不断提高,在上世纪八 十年代开始出现各种各样的商用嵌入式操作系统,这些操作系统大部分是为专用 微处理器而开发的。其中许多嵌入式操作系统已经被广泛应用,如windowsCE、
vxworks、uc/os.Ⅱ、Linux、QNX、Palm OS等等。嵌入式操作系统的使用,使嵌

入式系统的可靠性、稳定性得到很大提高,同时使得嵌入式系统的多任务处理能 力得到大大的增强. Linux是一种在网络上产生的操作系统,所有的Linux开发都在GPL(GNU
Public

License)的版本控制之下,因此任何人都可以通过网络得到Linux的内核

源代码,这使得无数的计算机高手加入到Linux的开发中来,在短短的十几年中 Linux已经迅速发展成一个稳定、成熟的操作系统。在嵌入式领域,Linux表现 出强大而完备的性能,其优势主要体现在以下几点: (1)源代码公开,系统升级、软件移植方便。只要遵循GPL的相关规定就可 以免费得到Linux内核的完整源代码,不用支付版权税,可以根据具体的系统进 行裁减和优化,这对于构建嵌入式系统具有重要的意义. (2)性能稳定、可靠.Linux本身具备的一个很大优点就是稳定,曾有人做过 实验24小时不问断运行的情况下,Linux三年内只出现过5次死机现象,而 windows死机次数则有150次之多,嵌入式系统一般要求在环境恶劣的情况下依 然能够稳定正常的工作,正是由于Linux的稳定性,才使得嵌入式系统得到高可靠
性的保证。

山东大学硕士学位论文

(3)内核可裁剪,功能可定制。Linux内核代码质量优越,大小可裁减,目 前正式公布的Linux内核最小可以裁减到143KB。Linux的内核采用模块化设计, 模块可以根据需要加载和卸除。这就使得开发人员可以针对自己的系统来编译自 己的内核,运行所需资源少,十分适合嵌入式应用。而且,Linux内核与用户界面 完全独立,各部分的可定制性很强,这有利于节约系统资源,非常适合于嵌入式 系统的开发。 (4)优秀的网络功能、支持多种文件系统。Linux上有一套成熟的网络协议堆 栈,SLm/PI口,Ax25使通过串121/并El/无线连接成为可能,对于TCP/IP协议 Linux有着最完备的支持,这使得Linux在网络方面有很大的优势。Linux内核 能够支持多种文件系统,如CRAMFS,RAMFS,JFFS/JFFS2,YAFFS,EXT2,EXT3。 FAT32等等,为高效的管理、使用嵌入式存储设备提供良好的支持。 (5)Linux支持多种体系结构的硬件平台。Linux可以稳定的运行在许多种体 系结构的处理器上,最新的Linux内核支持Intel x86、Motorola/IBM、Pow豇PC、
ARM(Advanced
RISC

Machinos)、Compaq(DEC)Alpha

IA 64、S/390

SuporH等

微处理器体系结构。Linax还可以在没有MMU(MemoryManagementUnit)的处理 器上运行,这就使得在嵌入式领域没有MMU的处理器得到相当广泛的应用。 鉴于Linux在嵌入式领域强大的生命力,很多国内外的公司开发出了各种各 样的商用嵌入式Linux的发行版,进一步推动了嵌入式Linux研究和应用。目前, 嵌入式Linux的应用领域已经涵盖了从工业过程控制、军事电子设备、航空航天 到消费类电子产品、网络通信设备等人们生活的各个领域。嵌入式Linux在航空 与航天、工业控制、电信、汽车系统等方面的应用是很广泛的,例如由eAE Electronic公司开发的计算机辅助训练系统(computer-aided
training system,

CATS)、欧洲同步辐射机构建造的加速度控制系统、欧洲太空总署开发的太空交 通工具控制(space
vehicle

contr01)等都成功的移植了嵌入式Linux系统。

嵌入式Linux的商业发行版在国外得到众多公司与商家的支持,他们在嵌入 式Linux的开发上积累了丰富的经验,目前几款著名的嵌入式Linux操作系统都 是由外国的公司或科研机构开发维护的.下面介绍已经广泛应用的几种嵌入式 Linux操作系统: 0)ucLinux



山东大学硕士学位论文

ucLinux是专门面向没有MMU的嵌入式处理器的小型操作系统.它是由 SnapGear维护的可免费下载的开源操作系统,它支持多种体系结构的处理器平
台,包括Motorola DragonBall(M68EZ328)、M68328、M68EN322、ColdFire、 QUICC;ARM7TDMI;MC68EN302;Axis
Atari
ETRAX:Intcl

i960;PRISMA;

68k等平台。目前已成功移植到近百种芯片结构中,它提供小型化的应用程

序库glibc、良好的开发工具链、标准的Linux的API接口。它内核体积小、实 时性有所增强,只适合不需要内存管理的小型系统。 (2)ARM-Linux ARM-Linux支持具有MMU的ARM架构的嵌入式处理器,它由Russell
King

负责内核的维护,任何人都可以免费下载其源代码。目前,ARM Linux支持包 括ARM 610、ARM 710、ARM
720

Tcores、ARM920T c,ores、StrongARMll0、

StrongARM 1 100、XScale等系列的ARM处理器。现在ARM-Linux已经成功应

用到网络计算机、各种开发板、机顶盒、手持设备等数十种设备中.
(3)RT-Linux

RT-Linux是世界上最早的实时Linux系统,是针对Linux系统缺少实时性的 一个非常成功的解决方案。RT-Linux使用的关键技术是中断控制硬件的软件模 仿。无论Linux正在做什么,无论Linux是否在核心态运行,无论Linux是否禁止 中断,也无论Linux是否被锁住了,实时系统总是能响应中断,从而保证了系统的实 时性。目前RT-Linux已成功应用于从航天数据的采集、科学仪器测控到电影特 技图像处理等众多领域.根据Linuxdevices.c.,OITI的调查情况,有5%的用户已经 将RT-Linux应用到他们的嵌入式设备中.
(4)DSPLinux

DSPLinux主要是面向多媒体、无线应用以及基于DSP处理器的各种嵌入式 设备应用。特别是在具有DSP核的ARM处理器中,DSPLinux得到广泛的应用。 DSPLinux内核运行在ARM处理器中,而实时任务如视频采集、声音处理等则 运行在DSP中。作为商业发行版,DSPLinux提供板级支持包,包含了配置、定 制DSPLinux的方法,良好的嵌入式应用程序开发的解决方案。 目前,由于Linux所具备的优秀特性,以及众多科研机构和厂商的不断推动, 其在嵌入式领域的应用前景将会更加广阔。因此,研究和分析嵌入式Linux操作

山东大学硕士学位论文

系统的理论和应用,开发相关的嵌入式Linux系统和应用软件,具有重大意义。

1.2主要研究内容
本课题主要研究内容是在以高性能的32位ARM处理器为核心的硬件平台 上移植稳定、可靠的嵌入式Linux操作系统与文件系统,开发实现相应的设备驱 动程序,实现友好的图形用户界面。具体包括以下内容: (1)嵌入式Linux的构建、移植。一个完整的嵌入式Linux系统需要以下的基 本元素:引导装载程序、Linux内核、根文件系统、应用程序。引导装载程序和 系统硬件紧密相关,不同的处理器采用不同的引导装载程序,需要根据系统的硬 件配置对引导装载程序进行配置,主要是设置处理器参数、内存地址分配、内存 空间的映射、加载操作系统内核等。Linux内核的配置、移植,将主要是修改内 核源代码树中各个文件夹下的配置文件,合理组织新的驱动程序,根据配置进行 条件编译、条件连接,最终生成内核映像文件。而根文件系统负责以文件的方式 管理系统的各种资源。 (2)设备驱动程序研究与开发。在Linux内核中缺少对一些特殊的嵌入式设备 的支持,例如A/D转换器、CAN控制器、USB摄像头等,因此需要分析设备驱 动程序的原理,开发面向嵌入式设备的驱动程序,将这些驱动程序以模块的方式 加到Linux的内核源代码中,可以选择直接编译进系统的内核映像,也可以作为 可卸载模块,动态的加载。主要实现了CAN控制器驱动程序设计与开发。 O)m形用户界面设计。图形用户界面选用MiniGUI作为开发平台。MiniGUI 是针对实时系统的嵌入式轻量级图形用户界面支持系统,具有多种运行方式,可 配置、可裁减,同时具有高性能、高可靠性,能够在处理器主频为30MHz,4M RAM空间的系统上运行。MiniGUI遵循GPL条款发布,源代码公开,提供了完 备的多窗口机制、消息传递机制,提供常用的控件类,支持对话框消息框,支持 多字符集多字体和JPG等常见图像格式,支持中文输入,还支持低端、高端显 示设备。在探测机器人本体上安装LCD显示器和触摸屏用来提供良好的人机操 作接口,设计图形用户界面来动态地显示机器人的各种参数。



山东大学硕士学位论文

1.3论文章节安排
本论文的各部分内容和安排如下: 第一章绪论阐述课题研究的背景和意义,分析嵌入式Linux所特有的优势,介 绍目前广泛应用的几种嵌入式Linux操作系统,为后面的系统移植作铺垫。 第二章目标平台硬件和软件系统方案,阐述系统采用的目标硬件平台,介绍嵌 入式微处理器¥3C2410A的功能结构和开发设计时需要注意的几个方面。根据系 统硬件特点,选择嵌入式Linux系统软件内容,研究如何选择制作交叉开发环境。 第三章系统引导程序分析与实现,研究系统引导加载程序Boot Loader的原理, 并对系统引导程序vⅣI的结构和工作原理进行分析,研究V1VI向目标平台移 植的方法及需要注意的问题,最终完成VIVI向目标平台的移植. 第四章ARM Linux内核移植和文件系统的构建.研究了Linux内核架构与启动 流程,研究嵌入式Linux系统存储设备的特点及相应的存储技术,研究了根文件 系统的架构标准,实现了ARM Linux内核移植、多文件系统的选择和根文件系 统内容的构建。 第五章ARM平台上嵌入式Linux驱动程序的设计与开发。研究了嵌入式Linux 驱动程序的原理,设计了¥3C2410A微处理器扩展CAN总线接口,给出了ARM Linux上CAN设备驱动程序实现方法。 第六章基于MimiGUI的图形用户界面的开发。研究了为嵌入式Linux系统配置、 编译、安装MiniGlJI的方法,并且利用MiIliGUI设计实现了一个图像和状态显
示界面。

第七章结束语,对整个研究工作进行总结并确定了后续研究目标。



山东大学硕士学位论文

第二章目标平台硬件和软件系统方案
嵌入式Linux系统包括目标硬件平台和软件系统这两个方面的内容。在 Linux移植前需要熟悉目标硬件平台的组成结构,并根据目标硬件平台的特点来 选择各种软件组件,正确搭建功能完善的交叉开发环境,然后制定出合理的软件 系统移植方案。

2.1目标硬件平台结构
本系统采用的硬件平台由两部分组成,分别是核心板和主板.核心板通过 200引脚的精密插座安装在主板上。核心板集成了微处理器¥3C2410A及关键的 功能芯片,其外观如图2-1所示。

图2-1 S3C2410A核心板

系统采用的硬件平台的总体结构如图2-2所示,主要部件如下:

图2-2硬件平台结构图



山东大学硕士学位论文

嵌入式微处理器:S3C2410A,200MHZ,32BITS
SDRAM:HY57V561620BT—H x 2.64M
NAND

Hash:K29F2808,16M

以太网:Ax88796 触摸屏:FM7843
LCD:STN 240*320

256色

CAN:MCP2510

USB接口:内置两个USB控制器,一个Host接口,一个Device接口. 2.1.1嵌入式微处理器S3C2410^ 目标平台所采用的嵌入式微处理器为韩国三星公司的S3C2410A,它是三星 公司推出的一款低价位、低功耗、高性能的32位RISC嵌入式处理器.该芯片 采用了ARM920T内核,具有五级整数流水线,工作频率最高可达266MHZ(在 2.0V内核电压下),运行速度可达1.1MIPS/MHZ。S3C2410A提供了以下丰富的 内部设备:分开的16KB的指令Cache和16KB数据Cache,MMU虚拟存储器 管理,LCD控制器(支持STN&Ⅱ呵),支持NAND Flash系统引导,系统管理 器(片选逻辑和SDRAM控制器),3通道UART,4通道DMA,8通道10位 ADC和触摸屏接口,USB主机,USB设备,2通道的SPI等【22】。¥3C2410A的 低功耗、精简和出色的全静态设计特别适用于对成本和功耗敏感的应用。 ¥3C2410A的显著特性是它的CPU核心,是一个由ARM公司设计的16/32位
ARM920T RJSC处理器。ARM920T实现了MMU,AMBABUS和Harvard高速

缓冲体系结构,¥3C2410A的内部结构图如图2.3所示。另外,通过提供一系列 完整的系统外围设备,¥3C2410A大大减少了整个系统的成本,消除了为系统配 置额外器件的需要.



山东大学硕士学位论文

图2-3¥3C2410A内部结构图嘲

在使用S3C2410A过程中需要关注的特点主要有以下几个方面: ①系统时钟:¥3C2410A集成了一个具有日历功能的RTC和具有PLL(MPLL 和uPLU的芯片时钟发生器。S3C2410A可以生成三种时钟信号,分别是CPU 使用的FCLK,AHB总线使用的HCLK和APB总线使用的PCIK。两个锁相环, MPLL用于FCLKHCLK和PCu:,UPLL用于USB设备。S3C24IOA支持 FCLK,HCLK和PCLK的分频选择,其比率是通过CLKDIVN控制寄存器的 HDIVN和PDIVN控制的,默认的比率是l:l:1.推荐的比率是1:2:4,即
HCI K-FCLK,2.PCI

K吼LK/4.

②NAND Flash控制器:S3C2410A支持从NAND Flash上启动和引导系统, 而在SDR.AM上执行主程序的设计方案。为了支持NAND Flash的系统引导, S3C2410A具备一个内部SRAM缓冲器,叫做”Steppingstone'’。当系统启动时,
NAND

Flash存储器的前面4K字节内容将被自动载入到Steppingstone中,然后

系统自动执行这些载入的引导代码。¥3C2410A对存储器映射也因启动方式的不 同而不同,具体分配如图2_4所示:系统的存储空间共分为8组(Bank),每组的

山东大学硕士学位论文 大小是128MB,共IGB。Bank0到Bank5的开始地址是固定的,用于ROM或 SRAM。Bank6和Bank7用于ROM,SRAM或SDRAM,这两个组可编程且大小 必须相同,Bank7的开始地址是Bank6的结束地址。

习-1明
SFIR Area

BOO幅淳V蝴
8D只AM

‘4硝№’
8DRAM

N瞳USed
8DRAM (BANK7.nOCOT) 8DRAM

(1弘aqKZ.nOC-,.qT)
日B^^取B n‘3l:8∞

惭滋‰
往蚺—料.nOC04)
SRoM SROM

(IR&NK6.nGC嚣e9

(I蝴K5.noC盛醣
8ROM

8R伽
SROM

往蚺I曲q.nOC04)

舶^№noc03)

纛|| | | |
引脚进行选择:
?

鳓遵‰
斟黛挈铭∞,,
8R洲
稿^十n∞nOcOO)

斟麓‰,


拥涵N瞄.nOC83)
8ROM (1由ttJqKl,州3108一,

r——葛面西葡丽r] 缝黧受鲢l
OM[t.'OI_∞
●毫用—一d日?吐昂I导



习;|t舶■_媳榭I覃

OMII:01_01.10

图2-4¥3C2410A存储空间映射图

③¥3C2410A的启动方式:¥3C2410A有三种启动方式,可通过OM[0:I】

●OM[I:0]=00处理器从NAND Flash启动; ●OM【1:o】=01处理器从16位宽的ROM启动; 0M【l:o】;10处理器从32位宽的ROM启动.

2.1.2脓_体系结构 从编程的角度看,ARM微处理器的工作状态有两种:ARM状态和Thumb 状态.当ARM微处理器执行32位的ARM指令集时,工作在ARM状态;当 ARM微处理器执行16位的Thumb指令集时,工作在Thumb状态。在程序的执 行过程中,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态 的转变并不影响处理器的工作模式和相应寄存器中的内容。 ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在


山东大学硕士学位论文

Thumb状态下)。ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种 数据类型,其中。字需要4字节对齐,半字需要2字节对齐。需要注意的是,在 ARM体系结构中,字(Word)的长度为32位,半字(Half-Word)的长度为16位, 字节(Byte)的长度为8位。 ARM微处理器支持7种运行模式,分别为【10】【lll:

①用户模式(1神:

ARM处理器正常的程序执行状态;

②快速中断模式(fiq):用于高速数据传输或通道处理;

@外部中断模式(irq):用于通用的中断处理;
④管理模式(svc):操作系统使用的保护模式,系统复位后的默认模式;

⑤数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于
虚拟存储及存储保护; ⑥系统模式(sys):用于运行具有特权的操作系统任务; ⑦未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于 支持硬件协处理器的软件仿真。 大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些 被保护的系统资源是不能被访问的。除用户模式以外,其余的所有6种模式称之 为非用户模式,或特权模式(Privileged Modes),其中除去用户模式和系统模式以 外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需 要访问受保护的系统资源等情况. ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状 态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可编程访闯的, 取决于微处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器 R0-R14,程序计数器PC、一个或两个状态寄存器都是可访问的. ARM状态下的寄存器组织如表2.1所示,包括通用寄存器及程序状态寄存 器。具体来说又可分为以下几类: ①未分组寄存器R0-R7:在所有的运行模式下,未分组寄存器都指向同一 个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运 行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造 成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。

10

山东大学硕士学位论文

②分组寄存器R8.R14:对于分组寄存器,它们每一次所访问的物理寄存器 与处理器当前的运行模式有关.对于R8.R12来说,每个寄存器对应两个不同的

物理寄存器,当使用liq模式时,访问寄存器R趾flq-R1Zjq;当使用除丘q模式
以外的其他模式时,访问寄存器RS_usr-R12_usr.对于R13,R14来说,每个寄 存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外 5个物理寄存器对应于其他5种不同的运行模式。 采用以下的记号来区分不同的物理寄存器:
R13_<mode>
R14_<node>

其中,mode为以下几种模式之一:u鹎铀,irq,吖c,abt,und。
寄存器R13在ARM指令中常用作堆栈指针.由于处理器的每种运行模式均 有自己独立的物理寄存器R13,因此,在用户应用程序的初始化部分,一般都要 初始化每种模式下的R13,使其指向该运行模式的栈空间,这样,当程序的运行 进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序 从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后 程序的正常执行。寄存器R14也称作子程序连接寄存器(Subroutine Link Register) 或连接寄存器LR。当执行BL子程序调用指令时,R14中得到R15(程序计数器 PC)的备份。其他情况下,R14用作通用寄存器。在每一种运行模式下,都可用 R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前 值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调 用返回。 ③寄存器R15用作程序计数器(PC) 在ARM状态下,位【1:O】为0,位[31:2】用于保存PC;在Thumb状态下,位 【O】为l,位[3l:1】用于保存PC。由于ARM体系结构采用了多级流水线技术,对于 ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当 前指令的地址值加8个字节。 ④寄存器R16用作CPSR(Current
Program Status

Register),即当前程序状态

寄存器。CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、 当前处理器模式标志位,以及其他一些相关的控制和状态位。

山东大学硕士学位论文

每一种异常模式下又都有一个专用的物理状态寄存器SPSR(Saved
Status

Program

register),即备份的程序状态寄存器。当异常发生时,SPSR用于保存CPSR

的当前值。从异常退出时则可由SPSR来恢复CPSR.由于用户模式和系统模式 不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知 的。Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集。程序可以直 接访问8个通用寄存器(R7-R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(uq 和CPSR。同时,在每一种异常模式下都有一组SP、LR和SPSR。
表2.1 ARM状态下的寄存器组织

2.2软件系统选择和构建
2.2.1构建交叉开发环境 建立和安装交叉开发环境通常是在开发嵌入式软件之前要做的第一件事情。 因为针对嵌入式程序的编译、连接与通常的windows程序开发不同:在嵌入式系 统中,由于其硬件能力所限,不可能在嵌入式系统上安装编译器和连接器,然后 在嵌入式系统上编写代码、编译并连接程序。于是就出现了交叉编译器 (cross-compiler)。交叉编译器是指运行在某台功能足够强大的宿主机(host)上, 可用来编译某个源程序,然后生成针对特定目标平台(target)的代码的编译器。 除了交叉编译器,在开发过程还需要以下几种工具:

山东大学硕士学位论文 ●相关二进制工具(连接器、归档工具、符号剥离器等)。 ●针对目标平台的C头文件.不同的目标平台具有自身特有的函数库及对 应的头文件,这样,在宿主机上,我们就需要保留一份针对该目标平台的头文件, 以便用来交叉编译c程序. ●针对目标平台的C函数库.和头文件一样,在宿主机上,我们也要保留 一份针对特定目标平台的函数库,以便连接生成最终的目标程序。 以上这些开发嵌入式系统软件所使用的工具通常就被称为交叉开发工具链 或者交叉开发环境。目前,开发嵌入式Linux系统首选的开发工具是自由软件基 金组织FSF(FreeSoitwareFoundation)提供的GNU开发工具。GNU开发工具已经集 成到各Linux发行版中,它与Linux内核一脉相承,作为开发Linux内核及应用软 件的标准开发工具,因为其效率高、功能强大而被移植到多种平台之上。 跨平台的GNU开发工具链组件包括:二进制工具binutils,编译器gcc,C函数库 gUbc,以及调试工具gdb。可以从fIp:,/flp.gnu.org/gnu/或任何其他的镜像网站下载 GNU工具链的各个组件。由于这些组件的开发和发行完全是各自独立的,选择 开发所使用的组件版本就成为建立交叉开发工具链的第一步工作。当与其他组件 的不同版本组合在一起时,并非一个组件的所有版本都能顺利完成建立工作,必 须试着找到适合主机和目标板的组合。经过测试对比,最终选择的组件为:二进 制工具套伺:binutils一2.10.1,编译器gcc?2.95.3,C库glibc-2.2.3,调试工具gdb.5.2.1, 以及Linux内核ARM.Linux 2.4.18-rmk7-pxal。 手工建立交叉开发工具是一件十分繁琐的工作,是否能成功建立交叉开发工 具与选择的组件版本甚至主机的编译器版本都有关系,通常需要在选用的组件上 打一些补丁才能完成工具链的制作.可以借助工具链制作工具如凹osstool[4”、 buildtool等来简化工具链制作过程。以crosstool-F具为例,该工具中包含了制作 工具链所必须的、经过验证的各种补丁,能根据选用的制作工具链组件的版本, 自动应用相应的补丁,提高制作出的交叉开发工具的可靠性.crosstool是通过脚 本来建立交叉开发工具的,需要注意的是,¥3C2410系列嵌入式微处理器没有硬 件浮点协处理单元,而是通过软件模拟实现浮点运算,所以选用的模板脚本文件 为dcmo-arm-sofifloat.sh,否则,应该选用demo.arm.sh或其他最为相关的脚本模 板。在使用crosstool制作交叉开发工具时主要是修改配置脚本来指定使用的各个

山东大学硕士学位论文

组件的版本。最终得到的内容如表2.2所示:
表2-2交叉开发工具主要目录结构 目录
lopt/hosVarmv41/bin /opt/host/armv41/lib
/opuhosVanuv4Vmclude

内容 交叉开发工具 目标平台使用的链接库

目标平台使用的头文件

/opt/host/armv4Fbin录包含了交叉开发工具链中全部的工具程序,将在主 机上使用这些工具来为目标板开发应用程序。最后,将交叉开发工具的搜索路径

写入脚本文件,导入到¥P姗环境变量中,完成交叉开发环境搭建。
2.2.2嵌入式Linux软件系统构成 一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: 1.引导加载程序:包括固化在固件(五rmware)中的boot代码(可选),和Boot Loader两大部分。 2.Linux内核:特定于嵌入式板子的定制内核以及内核的启动参数。 3.文件系统:包括根文件系统和其他建立于Flash设备之上的文件系统。 4.用户应用程序:特定于用户的应用程序。通常,在用户应用程序和内核 层之间还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有: MicroWindows和MiniGUI等.

本课题在移植过程中选择的引导加载程序是韩国公司开发的ⅥⅥ,它是完全
针对嵌入式微处理器¥3C2410构建的引导加载程序,具有良好的配置界面,系统 移植方便。内核采用针对ARM平台的ARM.Linux 2.4.18.rmk7-pxal,对于¥3C2410 处理器的代码已经基本实现,大大降低了移植的难度。为了保护系统文件不被破 坏,根文件系统采用了CRAMFS格式的可压缩只读文件系统。这不仅为系统节省 大量的存储空间,还大大提高了系统的可靠性。图形用户界面采用是MiniGUI, 它是面向实时嵌入式系统的轻量级图形用户界面,具有较好的层次结构和完善的 API函数,方便用户开发。

14

山东大学硕士学位论文

第三章系统引导程序的移植
引导程序Boot Loader是嵌入式系统在加电后执行的第一段代码,它主要负责 将操作系统映像装载到内存中,然后跳转到操作系统所在的空间,启动操作系统 运行。在所有的嵌入式Linux系统中,构建或移植一个Boot Loader都是一项最 基本的工作。

3.1引导程序原理
在PC的体系结构中,系统的引导加载程序由BIOS(BasicInputOutputSystem。 其本质是一段固件程序)和位于硬盘MBR中的系统引导程序(如LILO或GRUB 等)组成。而在嵌入式系统中,并没有BIOS那样的固件程序,存储介质也很少 使用硬盘,而是主要使用Flash作为系统存储的媒质,因此整个系统的启动加载 就完全由引导程序来完成。嵌入式系统中的引导程序将负责初始化硬件设备、建 立内存空间的映射图,然后将系统的软硬件环境带到一个合适的状态,以便为最 终调用操作系统内核准备好正确的环境。 在系统加电或复位后,任何CPU都会从制造商预先指定的一个地址获得第 一道指令。而任何用CPu构建的系统都会在该位置上使用某种形式的固态存储 器。例如在一个基于ARM核的嵌入式处理器中,系统在上电启动时从地址 0x00000000处开始执行,在这个地址处存储的通常就是系统的引导程序.通常 在嵌入式Linux系统中,一个同时装有Boot Loader、启动参数、内核映像和根 文件系统映像的固态存储器的典型物理空间分配如图3.1所示:

FIash从低地址到高地址方向

图3.1固态存储器的典型物理空间分配

其中,固态存储器中的启动参数区域是可选的,可以在编译Linux内核时指 定默认的启动参数。
Boot

Loader都是严重依赖于硬件而实现的,在嵌入式世界里几乎不可能建

山东大学硕士学位论文

立一个通用的Boot Loader。通常Boot Loader都是针对特定体系结构的CPU而 实现的,不同体系结构的CPU有许多不同的Boot Loader可用。除了依赖于具体 的CPU体系结构,Boot Loader还依赖于具体的嵌入式板级设备的配置。也就是 说,即使是基于同一处理器而设计的电路板,要想让运行在一块板子上的Boot Loader程序也能运行在另一块板子上,通常也都需要修改Boot Loader的源程序, 对其进行移植工作。因此,移植或开发特定的Boot Loader是构建嵌入式Linux 系统中一项必要的基础工作.而掌握Boot Loader的操作模式、工作流程和工作 内容,将会使这项工作变得比较容易实现【16】1171: 首先,对于大多数Boot Loader都具有两种不同的操作模式:启动加载模式 和下载模式。通常情况下,下载模式仅对开发人员有意义,因为从最终用户的角 度看,Boot Loader的作用就是用来加载操作系统,而并不存在所谓的启动加载 模式与下载工作模式的区别: ①启动加载(Boot loading)模式:这种模式也称为”自主”(Autonomous) 模式。就是Boot Loader从目标机上的某个固态存储设备上将操作系统加载到 RAM中运行,整个过程并没有用户的介入。这种模式是Boot Loader的正常工 作模式,因此在嵌入式产品发布的时候,Boot Loader必须工作在这种模式下. ②下载(Downloading)模式:在这种模式下,目标机上的Boot Loader将 通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核 映像和根文件系统映像等。从主机下载的文件通常首先被Boot Loader保存到目 标机的RAM中,然后再被Boot Loader写到目标机上的FLASH类固态存储

设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用。
此外,以后的系统更新也会使用Boot Loader的这种工作模式。工作于这种模式
下的Boot

Loader通常都会向它的终端用户提供一个简单的命令行接口.

其次,从Hash这样的设备上启动的Boot Loader运行大多都分为两个阶段。 第一个阶段主要包含依赖于CPU体系结构的硬件初始化代码,通常都用汇编语 言来实现。这个阶段的主要任务依次有: ①初始化基本的硬件设备,包括初始化中断、CPU、RAM等基本设备; ②准备加载Boot Loader第二阶段代码需要的RAM空间; ③复制第二阶段的代码到RAM;

16

山东大学硕士学位论文 ④设置堆栈,跳转到第二阶段的C程序入口点. 第二阶段通常用C语言完成,主要实现加载操作系统内核映像与根文件系 统、调用操作系统运行的功能。这个阶段的主要任务依次有: ①初始化本阶段要使用到的硬件设备; ②检测系统内存映射; ③将kernel映像和根文件系统映像从flash上读到RAM空间中; ④为内核设置启动参数; ⑤调用内核.

3.2ⅥⅥ结构分析
VⅣI是韩国的MIZI公司针对ARM9系列微处理器开发的一种BootLoader,

目前它支持SA-1110、¥3C2410这两种类型的微处理器。VⅣI具有结构清晰、功
能丰富的特点。它支持图形化的用户配置界面,提供对Flash分区、下载文件等

一系列命令。ⅥⅥ同时具备两种操作模式,即启动加载模式和下载模式.在处
于下载模式时,通过目标平台和主机的串行连接,VIVI向用户提供了一个简单 的命令行接口。用户可以通过命令行接口使用它的命令集。 vⅣI源代码的目录结构是模仿Linux内核的目录结构而构建的,因此不同功 能的文件被安排到不同的目录中。其具体的文件组织如下:

arch/存放微处理器平台相关的代码,包含ⅥⅥ支持的所有目标微处理器的
子目录。

documentation/vIⅥ的说明文件。
drivers/
include/

存放的是Flash和串口等的读写操作程序。 系统的头文件。 加载内核映像的文件。 处理器体系相关的文件,和一些平台公共的接口代码. 提供配置界面的程序. 可在vⅣI下运行的例子。
NAND

init/
lib/ scripts/ test/

Inil,

Flash操作程序。

与大多数Boot Loader一样,ⅥⅥ的运行过程也分为两个阶段。第一阶段的
17

山东大学硕士学位论文

运行代码在vivi/arch/s3c2410/head.s中定义,大小不超过4KB,它是从NAND Flash启动系统的引导代码,它包括对¥3C2410基本硬件的初始化、从NAND Flash上复制整个VIVI代码到RAM并跳转到第二阶段执行,其主要步骤依次如
下:

①基本硬件初始化:关闭看门狗、屏蔽所有的中断、初始化系统时钟、初 始化内存控制寄存器、初始化UART0: ②将VIVI所有代码从NAND Flash复制到SDRAM:
a.设置N^套iD Flash控制寄存器;

b.设置堆栈指针噼'.-调用C函数时必须先设置堆栈; c.设置即将调用的hand read.1lOi甬数的参数:rO=目的地圭JI:(SDRAM 的地址),rl=源地址(N^ND Flash的地址),r2=复制的长度(以字节 为单位);
d调用mind
read

110进行复制;

③跳转到ⅥⅥ的第二阶段代码入口处(init/main.c)运行 ⅥⅥ的第二阶段C语言代码是从init/main.c的mainO函数开始执行,通常
依次包含以下步骤: ①初始化定时器和设置各GPIO引脚功能: 通过调用board_init0函数来实现,代码在arch/s3c2410/Smdk.c中,
im board_init(void)

{ init_timeO= set_gpiosO;
rettLrn O:

) 其中,iIlitJ豳nco只是简单的令寄存器TCFG0=0xfoo,VⅣI未使用定时器, 这个函数可以忽略。∞t gpiosO用于选择GPA-GPH端口各引脚的功能及是否使 用各引脚的内部上拉电阻,并设置外部中断源寄存器EXTINT0-2。 ②建立内存页表和启动MMU= 代码在arctVs3c2410/mmu.c中,其中mem_map_initoi蚕数用于检测系统的内

山东大学硕士学位论文

存映射,将4G空间线性映射成4K个IM空间,并将其中的有效的DRAM 标志成cacheable。nunu_initO函数用于启动内存管理单元。 ③初始化系统的堆空间:内存动态分配函数mmalloc就是从中划出一块空 间内存的,mfi佻则将动态分配的某块内存释放回堆空间中。 ④初始化MTD。 ⑤初始化VⅣl命令:调用miscO、init_builtin_cmds0给新的命令添加相应 的处理函数。 ⑥启动内核:调用boot_or_vivioi弱数,根据用户的选择进入VⅣI的命令 行或者直接启动内核。 如前所述,VⅣI的整个运行过程,如图3-2所示:

图3-2ⅥⅥ的运行过程

3.3

VIⅥ移植实现
系统采用了韩国三星公司的¥3C2410A处理器,而且选择的是从NANDFlash

启动的方案,与三星公司的基于S3C2410处理器的评估板smdk2410相似,因此, 移植是在smdk2410板的基础上修改完成的,其中主要修改系统的硬件常数、Flash 分区信息、Linux启动参数和源代码的编译配置,具体内容如下: 与具体运行在哪一个处理器平台上相关的文件都存放在vivi/arch/IB录下,本 系统使用S3C2410A处理器,对应的目录为s3c2410。其中head.s文件是VⅣI 启动配置代码,加电复位运行的代码就是从这里开始的。由于该文件中对处理器
19

山东大学硕士学位论文

的配置均通过调用外部定义常数或宏来实现,所以针对不同的平台,只要是 S3C2410处理器,几乎不用修改,只要修改外部定义的初始值即可。这部分初始 值都在vivi/include/platform/smdk2410.h文件中定义.包括处理器时钟、存储器 初始化、通用I/0口初始化以及VⅣI初始配置等。主要代码如下:
#define FLASH
#define FLASH_SIZE

ESAROM BASE0// 定义 Flash B_址地理物始起
sz

16M

//定义Flash大小为16M

#define DRAM_BASE
#define

DRAM BASE0//定义内存物理地址 SZ_64M

DRAM_SIZE

//定义内存大小为64M

I}定义CPU时钟为200MHz
#dcfme S3C2410MCLK
#define 20280()()()0 0xal 0x3 0xl

MDIV_.200

#defme PDIV 200 #define SDIV_200

以下代码定义内存空间的映射,其中vⅣI位于RAM地址最高的IM空间上,

从高到低依次为:HEAP、MMU_TABLE、VWI_PRIV、STACK
#dcfme VWI_RAM_SIZE

sz_IM +DRAM_SIZE

/致lefme VIVI_RAM_BASE(DRAM_BASE

VlVLRAM SLZE)
#define HEAP SIZE

Sz-1M

#define HEAP BASE(VIVI_RAM_BASE-HEAP_SIZE)
#define IvIMU TABLE_SIZE #define SZ_16K

MMU TABLE_BASE(HEAP BASE?MMU_TABLE_SIZE)

栅lefme VIVI PRIV RAIVl
#define STACK_SIZE #define STACK #define #define

BASE(MMU_TABLE_BASE-VⅣI PRIV_SIZE)
SZ_32K

BASE(VIVLPRIV_RAM BASE?STACK_SIZE)

RAbt—SIZE(STACK_BASE-DRAM_BASE)
RAM_BASE DRAM_BASE

除了设置硬件常数,vivi还需要根据在Flash上的各个文件的大小来设置 Flash的分区(VWI
128k,param 64L kernel 1M,rooffs 2M)、Linux启动命令参数。

20

山东大学硕士学位论文 这些功能的实现需修改vivi/arch/s3c2410/smdk.c’具体的实现如下:
mtd__partition._t default_mtd_partitions[】={



name:
offset. size:

“、,i“”,

o’
Ox00020000,

flag:0

),{natrle:

"param”,

offset:0x000200009 size:0x00010000。 flag:0

},{name:

"kernel”,

offset:0x00030000, size: OxOOOD0000,

//size:0x000C0000,
flag:0

},{name:
offset: size:

"root”,

Ox00100000, Ox00200000,

flag:MF._p0NFS

),{name:

"jffs2”,

offset:0x00300000, size:0x03D00000, flag:

MF_JFFS2

} 根据以上的分区,设置Linux的启动参数如下:
#ifdefCONFIG¥3C2410 NAND_BOOT
char

linux_cmd[]=’'noinitrd root=/dev/bon/3

init=/linuxrc consoleffittyS0”:

#endif

完成以上的相关源代码的修改后,接下来就是配置、编译整个vⅣI源代码。

21

山东大学硕士学位论文

在编译之前需要修改VIVI的Makefile文件,指定Linux内核头文件所在的位置 和系统采用的交叉编译器。具体实现如下:
LINUX INCLUDE_DIR=/opt/host/armv41/included CROSS_COMPILE =/opt/ho吼/armv41/bin/armv41?unknown-linux?

vⅣ1支持menuconfig文本模式的配置界面,因此在命令行模式下执行下面
的命令:makemenuconfig,就会出现驱动选项的控制界面,如图3.3所示。然后

选择had

an

alternate

configuration

File。选择配置文件arch/def-configs/

¥mdl!【2410。去掉不需要的测试和调试程序的选项,选择保存退出。接着就可以

执行make,在ⅥⅥ的源码目录下生成vIⅥ的可执行文件,最后通过开发板 JTAG口和计算机并口建立连接,把ⅥⅥ移植至Ⅱ开发板上,重新加电,则可通过 超级终端看到相关运行信息,这说明ⅥⅥ已经在开发板上运行起来.

图3-3ⅥⅥ的配置界面

山东大学硕士学位论文

第四章ARM

Li

nux内核移植和文件系统的构建

除了系统引导程序以外,一个完整的嵌入式Linux系统需要包括一个Linux 内核及必要的设备驱动程序,以及不可缺少的根文件系统,这是嵌入式Linux 系统移植的工作的主体部分。 4.IAILM Linux内核移植 Linux这个名称严格意义上指的是以Linus Torvalds为核心的开发团队开发 的操作系统内核。在嵌入式系统的应用领域,并不存在官方(由www.kemel.org 发布)的所谓“嵌入式Linux内核”.许多情况下,嵌入式系统使用的内核都是 某个由第三方修改和发布的,这种内核通常是针对某款硬件平台而定制,或者是 为了支持某种特殊的应用类型。不同的嵌入式发行版所提供的内核通常提供了主 流内核中所没有的优化和针对内核调试工具的补丁。本系统采用的ARM
Linux

内核,就是由Russell King在官方内核的基础上针对ARM平台开发的一个版本. 为了确定内核移植工作具体该从何处入手,以及为了研究内核移植过程中的共性 问题,首先需要对内核的结构布局和引导过程有一个较清晰的认识,这样才能找 出内核移植过程中所出现的问题出在哪个阶段,才能保证移植工作顺利进行并最
终完成内核的移植。

4.1.1 ARH

Linux内核结构分析

Linux内核分为体系结构相关部分和体系结构无关部分。在Linux启动的第 一阶段,内核与体系结构相关部分(在arch目录下)首先执行,它会完成硬件寄存 器设置,内存映像等初始化工作。然后把控制权转给内核中与体系结构无关部分, 系统的其余部分在这个阶段期间进行初始化。在移植工作中要改动的代码主要集 中在与体系结构相关部分.内核目录树下的arch目录由许多子目录组成,每个子 目录用于一个不同的体系结构(MIPS,ARM,i386,SPARC,PPC等)。每一个这样的 子目录都包含'kernel和mnl子目录,它们包含特定于体系结构代码来完成诸如初始 化内存、设置IRQ、启用高速缓存、设置内核页面表等操作。一旦装入内核并给

山东大学硕士学位论文

予其控制,就首先调用这些函数,然后初始化系统的其余部分.Linux内核目录 树中与ARM平台相关的部分主要为arch/arm和include/asm-arm目录下的内容,详 细内容如下:
1.

目录arch/arm下的子目录和重要文件如下: ?kernel:与ARM平台相关的内核代码,主要包括与ARM平台相关的 汇编程序,如启动时的hcad.s;与异常,中断处理相关的entry-annv.S; 以及其它一些和体系结构中的中断异常处理,进程调度管理,系统调 用等相关的C程序。

●咖:与ARM平台下内存管理部分相关的内核代码。比较重要的有;
(1)与内存管理相关的lllln-arlnv.c,主要是针对AllM处理器中定义的页 表,页目录表的操作;(2)与内存异常处理相关的fault-armv.c: (3)与

各处理器的MMU,cache等内存管理部件操作相关的汇编代码,如 pros-armXXX.S等。 ●fib:ARM平台下经过了优化的内部库函数和低级I/O操作,例如内 存拷贝函数memcpy,I/O函数,位操作函数等,主要是用ARM汇编写 成。Linux内核代码不能使用标准C库,需要自己实现一些C库函数。 在内核树的主目录下也有一个目录lib对基本C库函数进行了实现,但 如果特定的体系结构下有这些函数的实现,就优先使用这些实现。因 为它们能针对硬件平台做最大程度的优化. ?boot:最终编译得到的内核就存放在这个目录下,并且还包含了一 些为在启动时对压缩内核进行解压所需要的代码,如compressedEI录 下的文件-head.S和misc.c. ●tools:用于自动生成象math-types.h那样的文件的脚本文件。 ●configs:包含每一种不同的机器类型的内核配置文件。内核配置文 件是在对LinuxPq核进行编译的时候所需要的文件,它描述了系统从 CPU类型到基本包含硬件方面的种种信息。可以说是对硬件系统的一 个非常全面的概述。 ●mach-XXXX:对于每一种不同的机器类型,都有一些和该机器类型 相关的一些程序。在mach-s3c2410目录下就包含了与三星的

山东大学硕士学位论文

¥3C2410处理器中的操作相关的代码,这是比kernel和姗目录下的代码
更贴近底层硬件平台的代码. ●vmlinux-mmv.1ds.in:链接描述文件,这是在生成内核的时候非常 重要的一个文件。内核可执行文件由许多链接在一起的目标文件组 成。目标文件有许多节,如文本、数据、iIlit数据、bss等。这些目标 文件都根据该文件链接并装入的。 2.目录include/asm-m'm/T的子目录内容如下: ?arch-XXX:与特定机型相关的头文件。 ●hardware:与ARM平台相关的一些芯片和设备的头文件。 ●mach:包含机器用到的接口定义和对机器进行描述的宏。 4.1.2^阴Linux内核引导分析 Linux内核引导部分的代码主要涉及到CPU及系统中各种硬件资源的初始 化,是向特定硬件平台移植Linux内核时需要注意及修改的关键部分.ARM 的启动流程图4.1所示,引导过程具体步骤如下:
l l
引导程序vivi装载内核映像 并跳转到内核映像首地址 Linux

l内核映像自解压并跳转到内核
l 入口ENTRY(stext) 初始化体系结构相关的资源





l初始化内核资源、加载驱动程 序、加载文件系统 生成系统i咄进程
创建getly进程,启动登陆 图4-1 ARM Linux启动基本流程




1.压缩内核的启动:嵌入式系统中内核映像文件通常使用zImage或者 bzlmage的压缩形式,压缩映像文件存放于flash2_oe.在连接脚本文件 arch/am/boot/compressed/vmlinux.1ds为编译器指定了内核目标文件的连

山东大学硕士学位论文

接顺序和地址。位于arch/arm/boot/compressed/head.S中的start段放在最前

面,是整个压缩内核映像的入口。在head.S中通过调用arch/ann/bo甜
comp坨ssed/mi∞.c文件的decompress_kernel0'/爱数进行内核解压缩操作,
在decompress_kernel0'i琢i数中,打印”Uncompressing

Linll)【…’信息后调用

gunzipi函数进行实际内核解压缩工作,正确解压完成后打印出’'done,
booting the

kernel”信息并返回hcad.S,接着跳转至lJcall_kemel执行:
cache clean flush

call_kernel:bl

bl cacheoff mov mov
nlov

r0.棚 r1.r7@restore pc,r4@call
architcctIl他number

kernel

其中,r7=机器类型号,“=内核执行地址。 在跳转到真正的内核入121arch/am3/kernel/head-armv.soe的ENTRY(stcxt)执行 前,要求CPU的状态应该已满足如下条件:

●加卸:
?r1.-机器类型号;
●MMU:必须关闭;

●cache:不用关心,开,关皆可; ●D-cache:必须关闭; 2.非压缩内核的启动:非压缩内核即真正Linux内核入口在arch/arm/kernel/ head-army.S中的stext段。这些与体系结构相关的汇编代码执行一些底层 的初始化设置工作,比如初始化内存,设置CPU寄存器,初始化内核堆栈, 设置内核页目录、标识体系结构以及调用start,kernel函数等等,具体步
骤如下:

●进入内核入口的ENTRY(stext)执行后,首先设置当前程序状态寄存器 CPSR的中断禁止位与处理器模式位,确保处理器禁止IRQ和FIQ,确保 处理器处于SVC模式. ●检查处理器,调用__lookup_processor_type判断处理器类型,查找运 行时处理器的ID值,是否与此Linux编译支持的ID值相等,不等则跳到

山东大学硕士学位论文 错误处理:调用

l∞l口lp砌it∞nlrc

type判断体系结构类型,无效则

跳到出错处理:

●调用c嗽ne-p税tabl鹤创建核心初始化页表,为内核映射4M的RAM
空间,为打开MMU做准备。 ●跳转到arch/arm/mm/proc-arm929.sh中雕J arm920_setup进行设置CPU

的控制寄存器、页目录地址等初始化工作: ●设置控制寄存器,打开数据缓存、指令缓存和MMU.ARM的数据缓存 必须和hnⅡ7一起打开,而指令缓存可以单独打开。 ●跳转至 栈顶
__switched 处执行,初始化SP,使其指向 pamm_栈程线核内

2),清除和bss, 918+noinu_daerht_tini(t机ini D器理处存保

器架构类型

到全局变量processor_id和machine_arch_.type. ●跳转到init/main.c中的start_kerneli弱数,启动内核的进一步初始化工作。 3.从内核源码的C语言文件init/main.c中的start kernel函数开始进一步的初 始化工作:初始化处理器平台、重新初始化内存管理、初始化异常和中断、 设置系统定时器与控制台等,最后执行reset
kemel
cpu

daerhtJ函内,用,执_行 程进父 后回返 调统系 程线核 个一建创来数

idle函数,予进程执行init函数。

4.init函数中调用do_basic_setup函数做最后的内核初始化工作,主要初始化 网络模块等。然后init进程根据配置文件/etc/inittab中每一行的要求生成新 的进程以完成相应的系统启动初始化工作.在系统初始化结束后,最后 由init进程来创建终端注册进程getty,屏幕显示‘'login:”开始用户登录,登 录成功后,getty进程将被shell进程所取代.自此整个系统就启动起来了。 4.1.3^肌Linux内核移植实现 掌握了ARMLin腿的内核结构和启动过程后,接下来就是在目标板上进行实 际的移植工作。AIu讧Ij删x已经对¥3C2410处理器提供了较完整的支持,内核文 件可以直接从网站www.atm.1inux.org.uk下载。移植需要做的主要工作是实现内核 对不同的板级设备的支持。包括对板级设备的初始化、设备驱动程序实现、对其 它设备的裁减等。根据目标板的配置,移植过程需要修改或注意的方面如下:

山东大学硕士学位论文
1.

处理器平台描述:处理器平台信息通过在include/asm-m'm/mach/arch.h

中定义machine desc结构体来描述。对于具体的处理器型号,都必须定义一个针

对自己具体目标板的machine desc数据变量。具体方法是通过在arch/arm/mach- s3c2410/smdk.c最后添加一对宏MACHINE START、MACmNE END为目标板的 ¥3C2410处理器平台初始化一个machine desc变量。代码实现如下: MACHINE_START(SMDK2410,”Samsung-SMDK.2410”)//体系结构号、结构名称
BOOT_MEM(0x30000000,0x48000000,0xe8000000) BOOT_PARAMS(0x30000100) FIXUP(flxup_smdk) MAPIO(smdk_map_io) INITIRQ(s3c2410_init_irq) MACHINE_END

这个静态结构变量中所初始化的数据,将会被start_kernel函数中所调用的 setup_arch'i函数用到。通过这个结构,定义了目标板的物理内存起始地址为 0x30000000(Bank6),物理VO起始地址为0x480000000,I/O空间映射到虚拟地址空 间Oxe8000000开始处,I/O映射初始化化函数为smdk map_io,中断初始化函数为
s3c2410._init._irq?

2.映射关系描述结构map de∞:ARM系统中内存和I/0地址是统一编址的。 这意味着在ARM平台下的物理地址空间内的一段地址可能是内存,而另外一段 又可能是外设的I/O,还有可能是外设上映射到系统空间内的一段RoM或I乙AM。 在带有MMU的ARM系统中,必须将ARM SoC芯片物理I/O地址映射到系统内存 空间中。然而,基于ARM的嵌入式系统种类非常繁多,不同的ARM SOC芯片和 板卡之间的I/O映射差别相当大,必须提供一种统一的机制来对这些差异进行描 述。因此,有必要采取一种方法来对物理地址空间和虚拟地址空间之间的关系进 行描述,以便于系统的内存映射的建立。目前,这个方法的核心数据结构就是定 义于include/asm-arm/mach/map.hoe的结构体map_dose,它对系统中的一段内存区 域的映射情况进行描述。
struct

map_desc{

unsigned long virtual;//虚拟地址的起点

山东大学硕士学位论文

unsigned long unsigned long

physical;//物理地址的起点 length;,,内存区域的长度

);

内核中通常用一个map_desc结构体的数组来对嵌入式目标板的系统FO空间 进行描述。当内核初始化,对内存映射进行建立的时候,将调用函数map_io,而

该函数所进行的初始化臁作所需要的重要参数就是这个nlap

移植中需要注意的是,物理I/O地址映射到的虚拟地址,原则上是可以映射到系 统内存空间中的任何部位.但是,系统内存空间中有些部分是内核专用的,或者
说在一些ARM Linux的内核版本中未使用,而在另外的版本中却用到了.这给移

植带来了一定的困难。为此,ARM Linux的维护者给出了一个内核的虚拟内存布 局描述的规范性文档【20】,文档中给出了物理I,O地址映射到的虚拟地址的参考位 置,移植过程中要尽量按照该规范文档进行。 3.对中断的处理:对于象S3C24lO这类SOC芯片来说,其中断处理来要比一 般体系结构中的要复杂一些。因为SOC芯片一般要集成一些片上设备,这些片上 设备本身就需要有中断,同时目标板上的设备通过GPIO还要引入中断。基于ARM

卡则更多。因此删Linux对于中断的处理代码无疑要象内存映射一样,将其处
理分离出来,由不同的板卡根据自身的情况来处理.与i386的系统结构一样,在 ARM平台下也不可能给每个外设都分配一个中断请求线。通常的方法是多个外 设共享一个中断请求线,中断发生时,由中断处理程序来对确定发生中断的设备。
ARM Linux的内核中,在include/asm-arm/mach/irq.h中就定义了一个中断请

的SOC芯片上集成的设备本身就已经种类繁多,而基于这些SoC芯片所设计的板

求描述数据结构irq_d雠.来对中断请求线进行描述。并定义了一个irq_desc.结
构的数组来对每条中断请求线进行描述。 4.实现板级设备驱动程序:需要向ARM Linux内核中添加目标硬件平台上 板级设备的驱动程序。包括将驱动程序的源代码添加至*Jdriver/录下相应的子目 录中,并修改相应子目录下的Makefile文件和Config.in文件,建立新的驱动程序 在内核中的依赖关系和内核配置菜单选项。具体驱动程序的实现见第五章内容 5.配置编译内核:在内核源代码目录下输入“mako*config”等命令之一 就可以对内核进行配置:

山东大学硕士学位论文
●make

config提供了一个命令行界面,然后对每一个内核选项依次询

问用户的选择。这种配置方法比较原始和麻烦,不建议使用。
●make

menuconfig提供了一个基于终端curs船的图形界面配置菜单,

见图4-2,使用起来非常方便,建议使用该方法。
?make

xconfig提供了一个基于TK的X Window图形界面配置菜单,

使用起来也不是很方便,不建议使用。
●make:oldconfig和make config类似,不过它只提示用户设置之前没

有配置过的选项。

图4-2“make menuconfig”方式内核配置界面

当配置完成之后,“驰ll【emenuconfig”将在内核源代码根目录下生成一 个.config配置文件,该文件包括了当前配置所有选项的设置信息。如果.config文 件已经存在,然后运行“make menuconfig”命令的话,该命令将以.c∞矗g为蓝 本设置各选项的当前值。也就是说,如果要在上一次的基础上修改配置的话直接 运行“makemenuconfig”就可以了。内核配置菜单还提供了保存配置文件和载 入配置文件的功能,可以把设置好的配置保存到一个指定的文件中,也可以从一 个已有的配置文件中装载先前的配置,然后以此为基础进行设置。 内核的配置选项很多,需要根据目标机的实际情况仔细选择。不过,并不是 所有的选项都需要设置,例如某些选项对嵌入式Linux系统没有太大的意义,某 些选项是不包括在系统的硬件和软件方案中的。比较重要的内核选项有:
●Code maturity level options
30

山东大学硕士学位论文
●Loadable module support ●General setup

●Memory technology devices
●Block devices

●Network device support
●Character devices

●Filesystems
●Console drivers

可以参考配置界面中的说明来确定每个选项的含义.不需要的功能都可以去 掉,这样能有效减小内核的尺寸. 编译内核通常分为几个步骤.首先要建立内核依赖关系:users make
dep

内核中的C源代码文件和头文件之间存在有一定的依赖关系,内核的Makefiic 必须知道这些依赖关系才能确定需要编译哪些源代码文件。但是使用“make menuconfig”命令配置完内核之后,该命令会自动生成一些编译所需的头文件。 因此,当改变内核的配置之后,在编译之前应该重新建立正确的依赖关系。 执行完“make dep”命令之后,接下来就可以执行“make
zImage”、“make

bzImage”或“makevmlinux”来编译内核映像了。比如:usersmakezImage zlmage目标的含义是编译一个使用gzip算法压缩的内核映像zImage;bzImago 的含义是“big zImage”,该映像也使用gzip算法,但确保生成的较大压缩内核 可以工作;vmlinux目标的含义是只编译一个非压缩的内核映像vmlinux。需要
注意的是“make zImage”既生成zImage,也生成vmlinux。

在x86架构上,zlmage和bzImage的区别是zlmage大小不能超过512KB,而 bzImage没有这个限制;为了克服x86架构上实模式的限制,bzImage使用了不同 的布局和装载方法,因此体积较大.对于其它处理器架构来说,一般只有zlmage 和vmlinux映像,没有bzImage映像;Makefile里面的bzb瑚gc目标等同于zImage。 如果出现编译失败,则有可能是因为系统配置不够完整,选择的内核功能不足以 支持当前的某些特性;或者选择的目标架构不支持某些特性。为了避免出现这种 情况,应仔细考虑各模块之间的依赖关系,以及目标机的实际需要。如果编译成 功,生成的压缩内核映像文件将放置在arch/arm/boot/compressedI|录下。如果在

山东大学硕士学位论文

配置内核时选择了内核模块支持的话,还需要使用如下的命令单独地编译内核模 块:
users make modules

4.2构建根文件系统内容
根文件系统一直以来是所有I肘Ⅸ类操作系统的一个核心组成部分,在内核 启动的最后阶段,所执行的操作之一就是挂载根文件系统。根文件系统是Linux 有别于传统RTOS主要特征之一,它赋予了Linux系统强大和灵活的功能,同时 也带来一定的复杂性。为了构建一个成功的嵌入式Linux系统,需要对根文件系 统的基本结构有清楚的认识和理解,包括如何安装系统库、内核模块、内核映像、 设备节点、系统应用程序和用户应用程序。另外,还需要根据项目的实际情况来 确定如何配置系统的各种初始化脚本和配置文件.在构造好根文件系统之后,还 要把它放置到实际存储设备的适当位置才能够起作用。 4.2.1根文件系统的结构 Linux根文件系统的结构是在Unix的影响下和自身的发展中并结合国际公认 的标准而形成的。目前,文件系统架构标准FHS(Flie
system Hierarchy

Standard)

是规范Linux根文件系统的标准文档。FHS(Filesystem Hier甜chy Standard)是用来 规范Unix类操作系统根文件系统的内容与结构的标准文档【191,它定义了文件系统 各个部分的指导性准则,定义了文件系统所需要的最少数量的文件与目录,列举 了准则的异常情况及特例。FHS的最新版本为2.3版,并I扫Filesystem
Standard Hierarchy

Group负责维护。FHS标准主要分为三大部分:Root
File

File

System以及详

细定义的Root

System下的/usr、/vatEl录结构。表禾1是FHS标准2.3版本中定

义的根目录中所需要的目录或目录的符号链接。
表4.1 FI-IS的根目录结构 目录
bjn

描述

基本的用户命令
设备文件和其它特殊文件 系统的配置文件

dev
etc

山东大学硕士学位论文
lib

必要的链接库,如c链接库、内核模块 文件系统临时挂载点 用来提供内核与进程信息的虚拟文件系统 必要的系统管理员命令 暂时性的文件 用户程序及库目录

trait

proc sbin

恤驴 U盯 V缸
boot

监控程序和工具程序所存放的可变数据
引导加载程序的静态文件和内核映像 用户的主目录

home
opt

额外的软件包所在目录

一个嵌入式Linux系统的根文件系统没有这么复杂,因为它通常不支持多用 户登录,功能和用途相对简单。一般来讲,只有/bin、/shin、/etc、/lib、/dev、/usr、 /var和/proc目录及其下的内容是需要的。而且,嵌入式Linux根文件系统的组成 比较灵活,可以根据项目的实际情况来决定采用什么样的结构来组织文件系统的 内容。最后,系统移植采用基本的根目录结构如表4_2所示:
表4_2嵌入式Linux的根目录结构 目录
bin dev e忙 l击

描述 基本的用户命令 设备文件和其它特殊文件 系统的配置文件

必要的链接库,如C链接库、内核模块
文件系统临时挂载点 用来提供内核与进程信息的虚拟文件系统

nmt
proc

sbin 缸驴
USr

必要的系统管理员命令
暂时性的文件

用户程序及库目录
监控程序和工具程序所存放的可变数据 yaffs2文件系统的挂载点

V甜

yaffs2

山东大学硕士学位论文

本节以下内容将介绍其中/bin、/sbin、/etc、/lib、/dcv和/var这几个基本目录下 的内容的实现。 4.2.2构建系统命令程序 /bin和/sbin目录包含了嵌入式Linux的基本的操作命令和系统管理命令程序。 在通用的计算机的Linux系统中,这些命令程序常使用自由软件基金组织FSF提供 的各GNu工具组件。在嵌入式系统中,由于受存储设备容量的限制,不可能为 每个命令程序移植单独的组件,常采用其他解决方案。系统在构建命令程序时采 用的是BusyBox。BusyBOX是一个很好的面向嵌入式Linw【的系统命令解决方案。 该工具体积小、功能强,已经成为嵌入式Linux系统开发的必备工具,得到了广 泛的应用。 BusyBox实际上是一个系统工具集,它将许多常用的基本命令与系统命令集 成到一个很小的可执行文件BusyBox中,然后将各命令程序创建成指向BusyBox 的一个链接,使得使用BusyBoxT具套件就象使用普通的GNU命令一样。BusyBOX

集成了IjmⅨ,【栅(系统常用的绝大部分命令,尽管它并不支持这些命令的所有
选项,但它提供的子集已能满足大多数应用的要求。BusyBox的源代码开放,可

以直接),灿ttp:llwww.busybox.n吒上下载。目前,最新版本的BusyBOX的配置与编
译与Linux内核的配置编译类似: ●配置BusyBox,选择所需要的命令功能
#make ARCH=arm CROSS=arm-linux-menuconfigure

●编译并安装eBusyBox套件到指定的目录:

4.2.3安装函数库和内核模块 嵌入式Linux的根目录结构中的/lib目录用于存放嵌入式Linux系统的函数库 和内核模块。在嵌入式Linux中,应用程序以下两种方式之一链接到外部函数: 要么在构建时与静态库(1ib*.a)静态地链接,并且将库代码包含在该应用程序 的可执行文件里;要么在运行时与共享库(1ib*.so)动态地链接。通过动态链接 装入器,将动态库映射进应用程序的可执行内存中。在启动应用程序之前,动态

山东大学硕士学位论文

链接装入器将所需的共享目标库映射到应用程序的地址空间,或者使用系统共享 的目标并为应用程序解析所需的外部引用. Linux系统对动态库的命令和链接有一定的规则,在开发和构建根文件系统 时需要注意。在库目录下面的某个动态库的相关文件通常包括一个实际的动态库 文件和指向该库文件的符号链接,文件按动态库的版本号命名。例如glilⅪ的实 际使用库文件是libc-2.3.3.80,对应的库符号链接文件是libc.SO.6.后者称为动态 库的共享对象名称,这个名称将被保存在链接该函数库的可执行程序映像中,这 样,只要在目标系统上存在这个名称的动态库就可以了。

删平台的链接库,该目录中包含的内容相当多,可以根据需要,只选择必要
的库复制到根文件系统的,lib目录中,其他的链接库在用到的时候可以放到具有

在肺下构建的共享函数库是建立的交叉工具f/fdopt/host/armv41/lib中的用于

写入功能的/usr/lib目录中。最少需要复制的包括动态链接器ld-2.3.6.80、主C链接 库libc-2.3.6.80以及它们的符号链接。复制符号链接需要使用cp.d带命令选项的拷 贝命令,否则将会复制链接所指向的文件本身。 在扩展系统功能时,需要确定应用程序具体依存那些动态链接库。然而在跨 平台开发环境中,主杌的ldd命令无法处理目标板的二进制文件。可以通过交叉 工具链中的readelf命令来找出应用程序依存那些动态链接库:
#arm-linux-readelf—a SHOME/armlinux/rootfs/usr/bin/myapp


grep’’Shared Ubrary'’

为了减小运行时动态库的大小,使用交叉编译版本的stripr具来处理根文件系统 中的库文件,把二进制文件中包含的符号表和调试信息删除掉。例如ARM版本 的strip-V具通常如下使用:users arm-linux.s仃如¥{ROOTFS}/Iib/*.80。 另外,在/lib/modules下存放着嵌入式Linuxl为核模块。需要从己经安装内核 模块的目录中将内核可安装模块复制到/lib/modules录下,也可在成功编译内核 后直接把模块目录安装到/lib目录下:
撑lllake INSTALL

MOD_PATH--¥{ROOTFS}/lib

modules install

相应地,还应该在¥{ROOTFS}/etc目录下添加--+modules.conf的配置文件,
该文件指定系统启动时自动装载的内核模块。 4.2.4创建设备文件 在以文件抽象为核心概念的Linux操作系统中,每个设备都有一个对应的设

山东大学硕士学位论文

备文件,这些设备文件(节点)位于根文件系统的/dev录下面。桌面Linux系统 中/dev目录下的设备节点是非常多的,而在嵌入式Linux系统中只需根据实际情况 创建和设置系统运行必需的设备节点即可. 下面列出的是一些基本的设备节点:
● ? ● ●

mem:物理内存设备

nulls空设备(向该设备写入的数据将完全被丢弃) zeros零字节源设备(从该设备上读出的数据全部为零) random:随机数生成设备

?ttyOs当前的虚拟控制台 ●ttyS0s第一个串口设备 ●ttys当前的tty设备
● ●

console:系统控制台
fbO:Framebuffer设备

在不同的系统中,设备节点的名字和设备号可能会有所不同;根据实际需要, 可能会用到其它的设备节点。利用以下几种方法可以实现在目标根文件系统中创 建设备文件: ?在主机上为目标系统准备的根文件系统中,手工创建/dev目录中
的设备节点。

●在目标文件系统的启动脚本(如IcS)中使用mknod命令动态创建。 ●从互联网下载基本可用的文件系统包,在此基础上修改。 ?使用相关的文件系统工具自动创建。 如果设备节点较少的话,可以在目标根文件系统中使用mknod命令手工创
建:

root#cd¥{RO饼曙S}/dev
root#mknod-In 666 null c 1 3

mknod命令用于创建设备文件节点,需要以超级用户的身份使用。上面mknod 命令的-m参数指定节点的访问许可属性为666,null为设备文件名,c指定设备类 型为字符设备,1N3为该设备的主、次设备号。可以参考内核源代码文档

山东大学硕士学位论文

Documentation/devices.txt文件来确定每个设备的主设备号和次设备号.或者也可

以把主机系.缈dev目录下的设备文件直接拷贝到¥{ROOTFS}/dev目录下来使
用。注意在调用印命令时要使用.a选项,否则cp命令会试图打开要复制的设备。 users印--aIdevlzero¥{ROOFS}/dev/ 如果根文件系统内容较多、比较复杂的话,可以从互联网上选择和下载一个基本 可用的根文件系统包,在此基础上做出符合需要的根文件系统. 此外,对于需要灵活处理的情况,可以在目标文件系统的启动脚本,如reS 中使用mknod命令来动态创建所需的个别设备节点.如果手工处理根文件系统实

在很麻烦,利用JFFS2和a蝴S文件系统相关的系统工具可以在这些类型的根
文件系统中自动创建设备文件节点,减少一些工作量。 4.2.5系统初始化 当Linux内核完成根文件系统的挂装、内核初始化结束时,它执行第一个用 户进程init并把系统的控制权交给它。init进程执行用户级的系统初始化工作,并 生成所有其它的进程;当系统关闭时,init负责结束所有用户进程并卸载所有挂 装的文件系统。也就是说,init进程是内核启动之后的系统总负责者。可以通过 内核启动参数“init=”来指定内核启动后所执行的init。内核首先寻找/sbin/init, 接着是letclinit,然后是/bin/init,最后它会尝试/bin/sh。 init的概念来自于UNIX
System

V,传统的init程序完成许多工作:不过在嵌

入式Linux系统中,init没有那么复杂.可以由以下几种方式来创建嵌入式Linux 中的init程序: ●使用类似System
V init的init程序

●使用BusyBox的init程序
?

自己编写一个简单的init

1.SystemVinit

大多数桌面Linux发行版中提供的“t程序是I±tMiquel vail Soorenburg编写的
System V init。该iIlit程序功能强大,不过体积较大,而且需要其它命令工具程序

的配合使用,包括halt、runlevel、shutdown、mesg等。可以从却.//flp.cistron.nl/
pub/people/miquels/sysvinit/获取该init程序的源代码。交叉编译System
V init程序

37

山东大学硕士学位论文

很容易,然后就可以把init复制到目标根文件系统中。还需要为init准备一个适当 的/etc/inittab文件,并在/ete/rc.d/目录下添加适当的启动脚本文件。一般情况下, /mc/inittab定义了系统的运行级别,/cte/rc.d/目录下的脚本文件定义了每一个运 行级别上运行的服务。表4-3描述了init的7个运行级别和一般用途。
表4-3 System 运行级别
O l




init的运行级别

意义 关闭系统 单用户运行模式

2 3 4 5 6

NFS多用户运行模式,命令行登录
完整多用户运行模式,命令行登录 不使用 X11,图形用户界面登录 重启系统

每个运行级别对应于一个特定的服务。例如,当进入运行级别5时,init将启 动X1 1和图形登录界面.当在用户级别之间切换时,前一个运行级别启动的服务 被关闭,新的运行级别的服务被启动。运行级别O和6有特殊的含义,它们被用于 安全地关闭系统;涉及的操作可能包括卸载除根文件系统之外的所有文件系统, 然后把根文件系统重新挂装为只读模式以防文件系统损坏的情况发生。在大多数 桌面Linux系统中,系统启动时的缺省运行级别是5。在嵌入式系统中,缺省运行 级别可以设为1,因为嵌入式系统中一般不需要多用户支持和访问控制。
2.BusyBox init

本课题构建的嵌入式Linux根文件系统的初始化程序采用的是BusyBox

init。

BusyBox的init命令提供了类似传统iIli程序的系统启动和初始化功能.和BusyBox
的其它工具命令一样,该init命令非常适用于嵌入式Linux系统,因为它只提供 了嵌入式系统所需的init大部分功能,不包括SystemV init中那些用处不大的特性. 此外,因为BusyBox init是一个独立的软件包,运行时不依赖于其它软件工具, 因此开发和维护起来非常方便。在以BusyBox为命令工具包构建的根文件系统 中,illit程序(如/sbin/init)只是一个指向bllsybOX程序(/bin/bus:/OOX)的符号链 接。也就是说,BusyBox是系统第一个执行的应用程序。BusyBox由文件名识别 出要执行的命令是init,然后跳转到init例程去运行。BusyBox init依次执行如下 的任务: ●设置init的信号处理函数

山东大学硕士学位论文

●初始化控制台 ●分析/etc,/inittab配置文件 ?执行系统初始化脚本,如Ictclinit.d/mS ?执行irdttab中action类型为wait的命令 ●执行inittab中action类型为one.A}的命令 ?循环执行inittab中action类型为respawn的命令 ?循环执行inittab中action类型为askfirst的命令 完成控制台的初始化之后,BusyBox检查/etc/inittab文件是否存在。如果该文 件不存在,BusyBox将使用一个缺省的inittab配置.通常,在inittab中设置系统重 启、系统关闭和init重启的缺省动作(action);此外,还设置action以启动从 Idevlttyl到/dev/tty4的四个虚拟控制台上的命令解释器。
如果BusyBox init找至tJ/etc/inittab文件,它将分析该文件,把其中包含的命令

记录到内部结构当中,然后在适当的时刻执行这些动作。BusyBox inittab文件的
格式和System


init程序使用的imttab格式有所不同。

inittab文件中的每一行都有如下的格式:
id:runlevel:action:proc*ss

这个格式和传统System

V init的格式是类似的,不过要注意:id项有不同的含

义。id一般用来指定所要启动的进程(process项指定)的控制终端.如果所要 启动的进程不是一个交互式的shcu的话,该项可以为空。BusyBox的init忽略 nmlevel项,因为它不支持运行级别,所以该项可以为空.process项指定所要 运行的程序名和启动的命令行参数。action项是应用到process的八个动作之一, 见表44所示:
袭4.4
Action BusyBox

inittab的动作类型

效果 指定初始化脚本的路径

sysinit
t-l镕paWll

当某进程结束时重启该程序

askfint
watt

类慨-espawn,在启动程序前提示用户按回车键
等待所启动的进程结束
只运行进程一次.不等待进程结束

On∞

山东大学硕士学位论文
c硼altdel
shutdown

按Ch'l+AIt+Del组合键时执行的进程 系统关闭时运行的进程 init重启时运行的进程.通常是init本身

restart

3.自己编写init

如果系统很简单,完全可以自己参考SystemVinit或者BusyBoxinit写一个 简单的illit程序,满足特定的需求即可。比如,可以简单编写一个iIlit程序,该程 序在启动后完成一些初始化工作,如挂装文件系统、创建设备文件、初始化网络

参数等等。之后,iIlit可以矗浊一个子进程,然后在子进程中执行某个预先定义好
的程序,而iait进程本身则等待子进程退出;当子进程终止时,iaiti莲程可以根 据子进程的终止状态完成相应的工作,如重新启动程序或者安全关机等。

4.3选择和安装多文件系统
在准备好目标根文件系统的内容之后,还需要为它选择一个合适的文件系统 类型,这个过程通常需要考虑到目标系统的用途和文件系统的特性。一般而言, 选择~个文件系统类型时需要考虑如下的因素;是否可写、持久存储能力、压缩 特性和断电保护能力等。此外,可以在一个嵌入式Linux系统中使用多个不同类 型的文件系统。例如,一个简单的系统有可能只需要对临时文件有写能力,其它 的执行文件、库和配置文件等都是只读的;这种情况下,可以对根文件系统使用 CRAMFS类型的文件系统,而对其临时文件部分使用TMPFS文件系统或者RAM disk上的文件系统,通常挂装盈Yvar/tmp目录,而ltmp目录只是指I句var/tmp的一个 符号链接。 4.3.1存储设备和MTD设备 在嵌入式系统中使用的存储设备可以分为内部存储器和外部存储器两类,内 部存储设备如RAM(随机访问存储器)一般用于运行时代码和数据的保存,外 部存储器用于保存程序映像和数据.这里讨论的存储设备是指外部存储器。 嵌入式系统中使用的存储设备和桌面系统中使用的有很大的不同。传统的嵌 入式系统中一般使用ROM和EEPROM等非易失性存储器来保存引导代码和操作 系统映像,嵌入式Linux系统中一般使用基于Flash(闪存)的存储芯片和电子盘。


山东大学硕士学位论文

这些存储设备在由内核使用之前必须经过恰当的设置,而且使用这些存储设备也 需要特别的软件工具。 1.Flash的类型与特点 Flash是一种非易失性存储器,可以对存储器以单元块为单位进行擦写和再 编程,而且不需要特殊的编程器。Flash实际上是对EEPROM的改进品种,任何 Flash元件进行写入操作前必须先执行擦除操作。Flash主要分为NOR和NAND两 类,分别具有不同的特点和用途。

用程序可以直接在Flash上运行,不必再把代码读到系统删中.使用NOR就象
和使用l认M一样,非常方便和直接。也就是说,NOR Flash是在CPU的内存物理 地址空间寻址范围之内的。 NOR的传输效率很高,在1.4MB的小容量时具有很高的成本效益。但NOR 要求在进行擦除前,先要将目标块内所有的位都写为0。因此,擦除速度很慢。 而NAND器件使用独立的总线来存取数据,各个产品或厂商的方法可能各不相 同。因此,HAND要比NOR复杂得多,向HAND器件写入信息需要较高的技 术和技巧。NAND的读和写操作采用512字节的块,类似硬盘等块设备.
NAND

Intel于1988年首先开发出NOR Flash技术,它的特点是芯片内执行,这样应

Flash的生产过程更为简单,可以在给定的模具尺寸内提供更高的容
Flash

量,价格也相对较低。目前,NOR Flash的容量从几KB~64MB不等,NAND

存储芯片的容量从8MB~128MB,而作为一种特殊NAND Flash的DiskOnChip可 以达到1024MB。NAND Flash每个块的最大擦写次数是100万次,而NOR Flash 的擦写次数是10万次.不过在可靠性方面,NAND不如NOR,容易出现位反转等
故障。

下面是NOR和NAND特点的总结: ●NOR的读取速度比HAND稍快一些 ?HAND的写入速度和擦除速度比NOR快很多 ●NAND的容量一般较大,耐用性好 ●NOR支持代码在芯片内执行 根据N0彤阳N^ND Flash的特点,经常把NOR用作启动RoM,而把NAND 用作大容量的文件系统存储介质。

41

山东大学硕士学位论文 2.MTD设备

在Linux的术语中,MTD(memory technology device)包括所有的存储设备, 例如传统的ROM,RAM、Flash和M.System公司的DO((DiskOnChip)。每一 种存储设备都有不同的功能、特性和限制。在传统的嵌入式系统开发中,开发者 必须针对不同的设备使用特定的硬件、软件工具和开发方法。 为了尽量避免对不同的设备使用不同的工具和技术,以及在不同的设备之上 提供通用的功能和接口,Linux内核开发者开发出了M1D子系统这样一个内存 设备抽象模块。MTD提供了一个统一的软件架构,把底层的MTD设备芯片驱动 和高层的MTD用户模块无缝地结合起来。MTD用户模块是指MTD子系统中建立 在MTD设备芯片基础之上的内核软件模块,它向上层的内核其它模块提供了一 致的抽象模型和接口。MTD子系统的架构所图4.3所示。


图4-3内核的MTD子系统

l驱动设备圈 、麓翌翟麓蕊幽

MID芯片驱动通过一个add

mtd

device0函数和mtd_info结构把自己注

册到MTD子系统中。mtd_info结构定义了一套通用的设备操作接口,包括读、写、 擦除和同步,高层的MTD模块将调用这些预定义的回调函数来进行相应的操作。 下面是常见的一些Linux MUD芯片驱动:


DOC

●t}DOC封装的N^ND Flash
●Common Flash Interface(CFI)

●RAM和ROM

DOC是一种特殊封装的NAND Flash,由M.System公司提供.目前Linux支

山东大学硕士学位论文 持DOCl000、DOC2000和DOC Millennium等系列的DOC.MTD子系统提供了

访问传统RAM和ROM的芯片驱动,这类驱动可以把映射到系统物理地址空间的 内存当作MTD设备来使用。此外,为了方便MTD用户模块的测试,MTD子系统 中提供了两类模拟真实MTD硬件设备的驱动:一个使用系统虚拟内存来模拟 MTD设备,另外一个使用普通块设备来模拟MTD设备。MTD子系统允许把内存 设备划分为多个分区。和硬盘分区类似,每个MTD分区可以当作一个独立的MTD 设备来使用,而且每个分区的数据格式可以是不相同的。

MTD提供了对字符设备M町H蛆洱口块设备MTD

BLOCK的支持。MTD_

CHAR字符设备提供了对Flash闪存的原始字符访问;MTD BLOCK缺设备象通常 的IDE硬盘一样,可以在其上创建文件系统。MTD cHAR字符设备文件在Linux 系统中的表现形式是/dev/mtd0。/dev/mtdl等,MTD_BLOCK块设备文件表现形式 是dev/mtdblock0,/dev/mtdblockl等。 4.3.2多文件系统的选择 根据硬件平台中将Boot Loader、内核与文件系统都存储在NAND Fl甜此的
一I

方案,结合各个文件系统各自的特点,选用多种文件系统来实现本次移植的嵌入 式Linux的文件系统。其中,根文件系统使用不可更改的文件系统来保护系统文 件不被破坏;/usrN录使用可读可写的文件系统便于用户扩展系统功能;/trap,/var 这些存放临时性和变动性较大数据的目录采用基于内存技术的文件系统,防止频 繁的对Flash闪存设备进行擦除操作,延长Flash闪存使用寿命. 目前,支持嵌入式Linux的文件系统非常多,拟采用的多文件系统中的每一 类都有多种性能相似的且都较常用的文件系统,因此,需要对它们作出选择:【21】 1.根文件系统的选择 嵌入式Linux系统中,为了保护系统文件不被破坏或不希望用户修改某些文 件,常采用一些不可修改的文件系统,CRAMFS和经过压缩的RAM disk都是具 有很高的压缩比的不可修改的文件系统,因此常被用着嵌入式Linux的根文件系 统。它们有相似之处但也有一些区别: CRAMFS是Linux的创始人Linus Torvalds开发的一种可压缩只读文件系统。 其压缩比高达2:1,可以为嵌入式设备节省大量的存储空间。另外,它的速度快、

山东大学硕士学位论文

效率高,其只读的特点有利于保护文件免遭破环,提高系统的可靠性。
RAM disk存在于内存中并且功能犹如块设备,内核可以在同一时间支持多 个活动的RAM disk。因为他们的功能犹如块设备,所以RAM disk_t:可以使用任

何磁盘文件系统。由于RAM disk上的内容将因系统的重新开机而丢失,所以 RAMdisk通常会从经压缩的RAMdisk映像加载内容。由于不用保存修改的内容, 所以RAM disk上的文件系统通常选用非日志文件系统的ext2。要使用RAM 作为根文件系统,内核必须配置为支持illitrd(illitial RAM disk)。 运行方式上,对于写入Flash设备的CRAMFS映像,当需要读取CRAMFS文 件系统中的内容时,系统会动态的算出所请求的数据在CRAMFS映像中的位置, 并实时解压到内存中,然后通过对内存的访问来获取文件系统中需要读取的数 据。同时,以后读取相同内容时可以直接从内存获得,不需要再次减压。C&u伍S 中的解压缩以及解压缩之后的内存中数据存放位置都是由CRAMFS文件系统本 身进行维护的,用户并不需要了解具体的实现过程,这种方式增强了透明度,对 开发人员来说,即方便,又节约了存储空间. 而对于写入Flash设备的RAM disk映像,首先必须在内核中配置RAM clisk的 大小与数量,并在Linux启动时按配置在内存中创建RAM disk,把RAM disk映像 减压缩到内存中,此后文件系统就在内存中,不再需要访问Flash设备了。RAM disk最大的缺点是,在正常情况下,同样的数据不仅在外存中占据了空间(以压缩 后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在), 这违背了嵌入式环境下尽量节约资源的要求。如果系统中有大量富裕的内存,选
用RAM disk作为根文件系统也是个不错的选择。但是对于大多数嵌入式系统来
disk

说,内存都是非常宝贵的资源,尽量节约资源也体现了嵌入式系统开发的精神, 因此,本次移植选用CRAMFS作为根文件系统。 创建CRAMFS根文件系统映像需要相关的文件系统工具mkcmmfs和 cramfsck。mkcramfs在一般的桌面Linux系统中都可以找到,如果没有的话可以 从内核源代码编译和安装这些工具.这两个工具的源代码位于内核源代码的 scripts/cramfs目录下,可以直接编译:
users

cd¥{KERNELDm}/scripts/CRAMFS

users make

山东大学硕士学位论文

然后把生成的mkeramfs和cramfsck拷贝到系统执行路径中就可以使用了. 可以使用如下命令来制作一个CRAMFS映像,S{ROOTFS}为目标根文件系统所
在目录:
users

mkcramfs¥{R00TFS)/au.M田S.img

创建完CRAMFS映像之后,可以使用相关的工具把它写到Flash设备上, 然后内核启动之后就可以使用其中的内容作为根文件系统了。 2.用户扩展文件系统的选择 由于选择了只读的文件系统ramfs做为根文件系统,为了利用Flash设备的易 读易写且断电永久存储的特性,以及为了扩展嵌入式系统的功能,因此需要一个 可读写、可保存数据的文件系统。基于Flash闪存设备的这类文件系统较常用、… 性能较好的有JFFS/JFFS2与YAFFS/YAFFS2文件系统。 JFFS棚币S2是瑞典Axis公司开发的一种基于Flash的日志文件系统。它最初是
专为NOR Flash设备开发的,由于NAND Flash使用越来越广泛,JFFS2也开始支

¥手NAND Flash设备.JFFS/JFFS2也是可压缩的,但压缩比不及crarnfs的高. 另#YJFFS/JFFS2具有碎片收集功能,并提供崩溃/掉电安全保护,所有这些

特点使它成为目n,枷aash设备上流行的文件系统格式。
YAFFS/YAFFS2全称Yet
Another Flash

FileSystem,它的出现较JFFS/JFFS2

晚,但是发展很快,它是专门为NAND Flash闪存设计的嵌入式文件系统,适用 于大容量的存储设备。它是日志结构的文件系统,提供了损耗平衡和掉电保护, 可以有效地避免意外掉电对文件系统一致性和完整性的影响。YAFFS,YAFFS2 充分考虑了NAND Flash闪存的特点,根据NAND Flash闪存以页面为单位存取的 特点,将文件组织成固定大小的数据段。利用NAND Flash闪存提供的每个页面 的备用空间来存放ECC(ErrorCorrection Code)和文件系统的组织信息,实现错误

检测和坏块处理.YJ岍s,YAFFS2文件系统是按层次结构设计的,分为文件系统
管理层接口、YA】陌s内部实现层和NAND接口层,这样就简化了其与系统的接口 设计,可以方便地集成到系统中去。与JFFS/JFFS2相比,它减少了一些功能,因 此速度更快,占用内存更少。

常使用经过专门优化的瑚S厂YAFFS2文件系统。因为本次移植使用NAND

通常,NOR Flash设备上选用JFFS/JFFS2文件系统,而NAND Flash设备上更

山东大学硕士学位论文

Flash作为文件系统的存储设备,所以扩展的文件系统选用YAFFS/YAFFS2。
由于ARM Linux内核并不支持YAFFSⅣAFFS2文件系统,所以需要从

http://www.alcphI.co.uk/armlinux/projects/下载最新的YAFFS2文件系统包,解压并 执行patch-ker.sh脚本(需要打补丁的内核路径作为参数),使内核增加对YAFFS/ YAFFS2文件系统的支持。 3.内存文件系统的选择 Flash设备都有擦除、写的次数限制,一旦达到这个限制,Flash设备将出现坏 块,其中的内容也将永远不能再擦除了。经常对Flash设备执行擦除、写操作, 会缩短Flash设备的寿命。因此,,嘶p、/var这些存放临时性和变动性较大数据的 目录应该采用基于内存技术的文件系统,防止频繁的对Flash设备进行擦除操作, 延长Flash闪存使用寿命。基于内存技术的文件系统主要有rarnfs和tmpfs文件系 统。与另一种基于内存的文件系统RAM disk相比,RAM disk是作为块设备来使 用,大小固定,可以格式化。而ramfs和tmpfs,它们不能被格式化,但是用起来 灵活,其大小随所需要的空间而增加或减少。
ramfs也是Linus Torwlds开发的一种文件系统。这种文件系统将文件放置内存

中,适合于存储临时文件或者频繁改动的文件。它的特点是其大小随着存储文件 的大小而膨胀或缩小,这样有效地节约了内存空间。由于文件放在内存中,因此 在系统断电后所有的数据都会丢失。 tmpfs和ramfs类似,也是一种建立在内存中的文件系统。不同的是,它不像

瑚晒一样建立在物理内存上,而是使用系统虚拟内存(swap十RAM),向虚拟内

存子系统请求页来存储文件。与姗蠡一样,tmpfs的大小也随着存储文件的大小
而膨胀或缩小,在系统断电或卸载后,tmpfs文件也会丢失。 由于在嵌入式Linux内核配置时关闭Tswap分区功能。在性能_Y_ramfs和tmpfs 两种文件系统差别不大,因此可以任选一种来使用。

山东大学硕士学位论文

第五章ARM平台上嵌入式L i nux驱动程序的研究与设计
设备驱动程序是操作系统内核和机器硬件之间的接口.为处理各种不同的外 围扩展设备,设备驱动程序的移植与编写就成为嵌入式系统板级移植所需要面对 的主要问题,也是嵌入式系统开发的主要任务之一。同样,在进行设备驱动程序 移植前需要了解Linux设备驱动程序的分类与实现原理。

5.1

ARM Linux设备驱动程序组织结构
Linux驱动程序属于Linux内核的一部分,其功能主要是直接操作硬件设备,

为用户屏蔽设备的工作细节,并向用户提供透明访问硬件设备的机制。Linux驱 动程序支持3种类型的设备:字符设备、块设备、网络设备。字符设备与块设备 的主要区别是系统对这两种设备的管理方式,即应用程序对字符设备的每一个。 I/O操作,都会直接传递给系统内核对应的驱动程序;而应用程序对块设备的操 作,都必须经过系统的缓冲区管理,间接传递给驱动程序处理。至于网络设备, 它是一类比较特殊的设备,它没有对应的设备文件节点,在系统和驱动程序之间 通过专门定义的数据结构进行数据传输。 Linux支持的设备类型分为三类,相应的设备驱动也分为三种类型,虽然内 核中存在许多不同的这三类设备驱动,但它们都具有一些共性: ●内核代码;设备驱动是内核的一部分,与内核中其他代码一样,出错将 导致系统的崩溃;


内核接口:设备驱动必须为Linux睦J核或其他从属子系统提供~个标准 接口,如终端驱动为Linux内核提供了一个文件I/O接口;

?内核机制与服务:设备驱动可以使用标准的内核服务,如内存分配、中 断发送和等待队列等等; ●可加载:大多数Linux设备驱动可以作为模块进行加载,在不使用时卸 载,这样内核能有效的利用系统资源; ●可配置:Linux设备驱动可以连接到内核中,当编译内核时,那些需要 连入内核的驱动应该是可配置的:

47

山东大学硕士学位论文

●动态性:当Linux系统启动及设备驱动程序初始化时将自动查找它所控
制的硬件设备。

在Linux中,设备由一个主设备号和一个次设备号标识.主设备号唯一标识 了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索 引。次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中, IO请求所涉及到的那个设备。系统中的每一个设备都用一个特殊的设备文件来表 示。在与设备驱动程序通信时,内核常常使用设备类型、主设备号和次设备号来 表示一个具体的设备。但是从用户角度而言,这一方法不太实用,因为用户不会 记住每台设备的主、次设备号,用户也不希望使用不同设备时需要使用不同的方 法,而是希望能用同样的应用程序和命令来访问设备和普通文件。为此,设备驱 动程序为应用程序屏蔽了硬件的细节,Linux中的设备管理应用设备文件这个概 念统一了设备的访问接口。这样,在应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作。图5.1展示了用户应用 程序与字符设备和块设备之间的通信关系。


I I

用户应用程序

{I I系统番圣c函数库
系统调用接口
】[

虚拟文件系统

{I
I I

字符设备

I高萼3莩1-存

】【
底层硬件设备

块设备

设备驱动程序

图5.1应用程序与字符设备和块设备之间的通信关系

网络接口设备较特殊,它采用完全不同于与字符以及块设备驱动程序之间所 采用的标准文件系统调用的通信方式,而是采取调用一套和数据包传输相关的函 数,这主要是基于BSD UNIX的soekedOt制。

48

山东大学硕士学位论文

5.2设备驱动程序设计
设备驱动程序与用户应用程序不同,它没有mainO函数,而是通过使用宏
module_init(初始化函数名)将初始化函数加入内核全局初始化函数列表中,内核

初始化时执行驱动程序的初始化函数,从而完成驱动的初始化和注册,之后驱动 便停止等待被应用软件调用。驱动程序中有一个宏moudule exit(退出处理函数名’ 注册退出处理函数.它在驱动退出时被调用。而且在驱动程序中是不能使用标准 C库的,因此不能调用所有的C库函数,比如输出打印函数只能使用内核的 prinIl【函数,包含的头文件只能是内核的头文件,比如<linux/module.h>。 在Linux中,大部分的字符设备和块设备驱动程序操作都涉及到几个重要的 数据结构,它们是:[2116)[15l
1.
struct file_operations:

file_operafiom结构定义于include/linux/fs.h文件

中,是整个Linux内核的重要数据结构,它也是file、inode结构的重要成员,, 表5.1中分别说明结构体中主要的成员:
表5-1 file_operations结构
OWI'ICY llseek read wnte

module的拥有者 重新定位读写位置 从设备中读取数据 向字符设备中写入数据 只用于文件系统,对设备无用 控制设备,除读写操作外的其他控制命令

readdir ioctl
mmap
open

将设备内存映射到进程地址空间,通常只用于块
设备 打开设备并初始化设备 清除内容.一般只用于网络文件系统中 关闭设备并释放资源

flush release fsync fasync
lock

实现内存与设备的同步。如将内存数据写入硬盘
实现内存与设备之间的异步通讯 文件锁定,用于文件共享时的互斥访问 在进行读操作前要验证地址是否可读 在进行写操作前要验证地址是否可写

ready
writer

在嵌入式系统的开发中,一般仅仅实现其中几个接口函数:read、write、ioctl、 open、release,就可以完成应用系统需要的功能.
2.struct

file:在Linux中,字符设备和块设备通过设备文件来标识,内

山东大学硕士学位论文

核中,设备文件和普通文件一样,都是通过include/linux/fs.h文件中的struct file结 构来表示的。file结构代表一个打开的文件(设备文件与普通文件),它由内核在 open时创建,并传递给在该文件上进行操作的所有函数,直到最后的。lose函数。 在文件的所有实例都被关闭后,内核会释放这个数据结构。struct file中,与设备 文件相关的成员有如下一些:
●stmct den缸y*f

dcnnT.f..d锄try结构是VFs中文件管理的重要结

构,其中记录了文件管理的所需信息;
?¥仃tlCt

file_operations*f

op=与文件相关的所有操作函数的接口。内

核在执行op∞操作使对这个指针赋值,以后需要处理这些操作时 就读取这个指针。可以在需要的时候修改这个指针以完成不同的

操作。如在主设备号为l的open代码中根据次设备号替换痂妒£!op
中的操作,这种方法重载的技术体现了面向对象的编程思想:
●unsigned int

f_flags:文件标志。如:O_RDONLY、O_NONBLOCK

和O SYNC。驱动程序为了支持非阻塞型操作需要检查这个标志,

其他标志则很少用到;
?mode
t f

mode:文件模式。通过FMODE READ和FMODE WRITE

来标识文件的可读可写,ioctl函数中可能需要查看这个域以检查读 写权限;
●void+private

data:驱动程序可以将这个字段用于任何目的或者忽

略这个字段,它是跨系统调用时保存状态信息非常有用的资源。
3.struct

inode:内核用inode在内部表示文件,对于单个文件,可能会有许

多个表示打开的文件描述符的file结构,但它们都指向单个inode结构。inode结构 包含大量有关文件的信息,但只有几个成员对编写驱动程序代码有用:
●devj i rdev:对表示设备文件的inodc结构,该字段中包含了真正的

?

删block

设备编号:

device’i

bdev:块设备的内核的内部结构,当inode指向

一个块设备文件时,该字段包含了指向block device结构的指针;
●struct

cdev+i

cdev:字符设备的内核的内部结构,当inodc指向一个

字符设备文件时,该字段包含了指向cdev结构的指针。

山东大学硕士学位论文

5.3

CAN设备驱动程序设计与实现
CAN(ConU'ollerArea Network)是一种非常有效的支持实时控制和分布式控

制的串行通信网络。CAN总线由于其成本低廉、可靠性高、抗干扰能力强、通信 方式灵活等特点,目前已经广泛应用于网络化控制系统中。虽然目标硬件平台的 嵌入式微处理器S3C2410A芯片上没有集成CAN总线控制器,但是通过S3C24lOA 的SPI接口系统很容易得实现了CAN总线控制器的扩展,同时设计并实现了CAN 控制器的驱动程序,使系统具备了CAN总线网络功能. S3C2410A微处理器扩展CAN总线接口

5.3.1

系统扩展CAN总线控制器采用TMicrochip公司的MCP2510,它完全支持 CAN总线的V2.0A和V2.0B的技术规范.MCP2510支持最大1Mb/s的可编程波特 率,具备帧优先级设置、接收帧过滤与屏蔽以及报文管理等特性,其功能如下【23E (1)支持标准帧和扩展帧两种数据帧格式,每个帧的数据字段长度可为0-8字 节。支持远程帧; (2)两个接收缓冲器,可优先储存报文。六个完全验收滤波器,两个完全验 收屏蔽滤波器; (3)三个发送缓冲器,具有优先级设定以及发送中止功能;

(4)具有bop—Back(自环检测)模式,便于测试;
S3C2410A内部具有2个SPI模块,支持轮询、中断与DMA三种数据发送模式。 系统设计时,将MCP2510作为从设备连接到¥3C2410的SPl0口,如图5.2所示CAN 总线接口具备以下特点: (1)本接口设计将MCP2510的总中断INT作为¥3C2410的外部中断4接入系 统。系统没有使用使能发送请求和接收完毕中断功能,在MCP2510的中断 处理函数中,通过SPI接口访问MCP2510内部相应寄存器来确定具体的中 断事件,并对其做出处理。 (2)为了增强系统的抗干扰能力,提高系统的稳定性,在CAN控¥U器与CAN 收发器之间加入了光电耦合器6N137。同时也解决了MCP2510与TJAl050 之间电平兼容问题,还有效的抑制了CAN网络中的尖峰脉冲及噪声干扰。

5l

山东大学硕士学位论文

(3)将CANH与CANL:Z间120Q的端接电阻改良为两个等值电阻与一个旁路 电容的形式,有效提高系统的抗干扰能力。

图5-2 MCP2510组成的CAN总线接口

5.3.2

C州总线驱动程序的体系结构

1.MCP2510的初始化 CAN总线控制器MCP2510的初始化步骤如下: ●软件复位,进入配置模式 ●设置CAN总线波特率

●关闭中断,设置D过滤器
●切换MCP2510到正常状态(Normal) ●清空接受和发送缓冲区 ●开启接收缓冲区,开启中断(可选) 通过设置MCP2510中的CNFl、CNF2、CNF3三个寄存器,实现不同时钟 下,CAN总线通讯的波特率的设置。在MCP2510的输入时钟为16MHz。按照如 表5.2所示方式定义CAN总线通讯的波特率。
表5-2 MCP2510的波特率设置

篓eA霞波躺津。;
]25Kpbs 250Kpbs 500Kpbs

。灏煅
l l l l

麓输段i 翱磷4 。獭位豸
7 7 7 4 4 4 2 4 4 4 2

二臼谣誓…
Ox03 0x01 0x00 0x00

嚣膨 +CNF32
Ox9E Ox9E Ox9E Ox9E 0x03 Ox03 Ox03 Ox03

1Mbps



山东大学硕士学位论文

2.CAN设备驱动的流程 在嵌A.式Linux操作系统中,CAN总线通信程序的设计可分为发送数据、接 受等待和中断处理3个模块来实现。如图5.3所示,在系统中CAN总线的数据发 送和接收是两个不同的线程。在驱动程序中建立数据发送和接收缓冲区。中断处 理程序只负责填充(或者读取)缓冲区中的数据,然后唤醒等待接收(或发送) 数据的任务。数据的发送和接收都是通过独立的缓冲区由中断来实现。





中断子程序





图5-3CAN通信程序结构

5.3.3

C州总线驱动程序实现

1.文件操作接口的实现 CAN设备驱动程序最终提供给应用程序的是一个流控制接口,主要包括 open、close(或realse)、read、write、ioctl等操作。添加设备驱动程序,实际上 就是给上述操作编写相应的程序代码。对于字符设备和块设备,LinuxF勺核对这 些操作作了统一的抽象,而每一个设备都会用一个特殊的设备文件来表示,通过 虚拟文件系统,应用程序得到一组与具体设备无关的系统调用。而虚拟文件系统

的主体就是结构体file_operations,每一种文件系统都有自己的filc-op懿ti∞s数
据结构,结构体中的每一个成员都是一个函数指针,实际上实现了对于不同操作 的函数跳转功能,例如opfffl是指向具体文件系统用来实现打开设备文件操作的入 口函数。可以说file._operations实现了标准文件操作到硬件设备操作的映射。 根据CAN控制器的特点,CAN设备驱动程序实现了结构体中一部分重要的 操作,在Linux 2.4.18内核中,具体声明的实现如下:
static struct file_operations

s3c2410_fops={

山东大学硕士学位论文 own6T:THIS_MODULE,
write:s3c2410 mop2510_write, read: s3c2410 mop2510_read, s3c2410 mop25 10_ioctl,

ioctl:
open:

s3c2410,mcp25 10_open,

release:s3c2410 mcp2510_release,

};

在s3c2410_fops中声明的每一个成员功能描述如下(未声明的成员值为O): (1)s3c2410_mcp2510_open负责对将要进行的I/O操作做好必要的准备工 作,主要包括限制CAN打开次数、清空3个发送缓冲区和2个接收缓冲区等。 (2)s3c2410_mcp2510._telease负责CAN设备关闭时的操作,包括还原打开次 数,关闭中断等。 (3)s3c2410_mcp2510_ioctl负责CAN设备读写操作之外的工作特性设置,主

要完成设置工作模式、数据帧D、设备滤波器、总线波特率等工作.
(4)s3c2410_mcp2510_write负责处理CAN总线数据的发送方法. (5)s3c2410_mcp2510_read负责处理CAN总线数据的接收方法。 2.驱动程序入口的实现 驱动程序在加载到内核中时,会首先运行驱动程序的初始化函数,然后等待 系统调用在file_operations数据结构中定义的相关函数,实现对设备的操作。CAN

设备的初始化函数主要负责创建CAN设备的节点设备文件、注册∞N设备的中
断处理函数、初始化McP2510等工作。初始化函数工作流程如图5-4所示 主要程序代码如下:
static int—init s3c2410._mcp2510

init(void)

{……………………………………………… init_MCP2510(BandRate__250kbps);
ret=register chrdev(O,DEVICE_.NAME,&s3c2410._fops);

Major=ret;

删阿eq峨t蛔(MCP2510L皿Q,s3c2410
54

isr mcp2510,SA_INTERRUPT,

DEVICE_NAME,s3c2410._isr_mcp2510);

山东大学硕士学位论文

#ifdefCONFIG_DEVFS_FS dcvfs_spi_dir=-devfs mk dir(NULL,。can”.NULL);

devfs__spirav闻evfs._register(devfs._spifir,”0",DEVFS-FL_DEFAULT,Major,
SPIRAW_MINOR,s
#Mndif

wcI腿I

SARUSR I



IWUSR&s3c2410 fops,NULL);

图54初始化函数工作流程

在Linux系统里,启动程序通过调用register_chrdev[甸系统注册字符型设备驱 动程序。register chrdev定义为:
月qnclude<Linux/fs.h≥.

#include<Linux/ermo.1l>
int

register_chrdev(unsigned

int

major,const

char’Dame,struct file._operations

‘fops); 其中,major是为设备驱动程序向系统申请的主设备号,如果为0则系统为此 驱动程序动态地分配一个主设备号。name是设备名。fops就是前面所说的对各个 调用的入口点的说明。此函数返回0表示成功。如果是动态分配主设备号成功, 此函数将返回所分配的主设备号.如果register chrdev操作成功,设备名就会出 现/!F./proc/devices文件里。
在使用ARM Linux时,通过配置内核,使其支持设备文件系统devil(device

山东大学硕士学位论文
file

system),从而可以实现对动态分配的主设备号的管理。宏定义 FS用来判断系统在配置时是否使用了设备文件系统,然后通过

CONFIG_DEVFS devfs

register0函数创建设备文件系统的CAN设备节点。

同时,CAN设备驱动程序通过调用request_irqgfi数来申请中断,向系统注册 CAN设备的中断处理函数)bs3c2410_isr_mcp2510.request_irq函数原型如下:
#include<Linux/sched.tl> int request_irq(unsigned int irq,

void(’handlerXint irq,void
unsigned long flags,
const char odevice,

dev id,struct

pt_regs+regs),

void’dev_id);

参数irq表示所要申请的硬件中断号。handler为向系统登记的中断处理子程 序,中断产生时由系统来调用。flags是申请时的选项,它决定中断处理程序的一 些特性,设置为SA INTERRUPT,表示中断处理程序是快速处理程序,该中断 处理程序运行时,其他终端都被屏蔽。device为设备名,将会出现宅E/proc/ interrupts文件里。dev_id为申请时告诉系统的设备标识。

山东大学硕士学位论文

第六章基于_iniGUI的图形用户界面的设计

6.1嵌入式系统下的GUI
图形用户界面GUI(GraphicalUserInterface)或者人机界面UI(UserInterface) 又称人机界面HCI(Hunran-ComputerInterface),是指计算机与其使用者之间的对 话接口121。图形用户界面GUT是作为计算机系统的一个重要组成部分,是计算机 行业重要的研究领域。目前,在PC上的Linux已经拥有了成熟的“标准”图形 支持组件,包括作为显示界面基础的x窗口系统(其中包括针对相关硬件的Linux 驱动程序),作为窗口环境的GNOME或KDE,以及功能强大的浏览器 (Netscape,Opera或Mozilla).然而,对于嵌入式设备,虽然硬件条件与过去相比 在逐渐改善,但是与台式计算机相比,严格的资源限制和特殊的应用需求导致上 述典型的窗口组件无法直接应用。这主要体现在:一方面,嵌入式设备无法提供 桌面图形软件所需要的程序存储空间及内存运行空间。例如,嵌入式设备一般只 有2-16MB的闪存用于存储程序,以及4-32MB的内存用于运行这些程序,而像 GNOME对系统资源的要求是:14MB RAM,95MB Disk,这样大的资源需求不 可避免地将提高嵌入式设备的成本、占用设备的空间、增加设备的功耗。另一方 面,一般的图形系统也无法满足嵌入式系统对于定制用户界面外观、配置图形 功能、提高图形系统的性能以及支持特殊的显示和输入设备等方面的需求。因此, 研究和实现嵌入式图形用户界面成为开发嵌入式Linux系统的热点之一. 6.1.1国内外嵌入式CdJl的研究与比较 如前所述,由于在嵌入式操作系统中,其硬件环境比较苛刻,因此要求运行 其中的图形界面尽可能的精简,而传统的窗口系统尚不能满足嵌入式系统的需 求.目前,国内外已经有许多机构和团体开发出来多种专门针对Linux的嵌入式 GUI系统,较为著名的开放源码项目有Microwindows、OpenGUI、MiniGUI、 QT/Embedded等。然而,由于开发人员对嵌入式系统在理解上的不同,使得这 些GUT系统在接口定义、体系结构、功能特性等方面存在着很大的差别。下面 对这些系统进行简单分析比较。

山东大学硕士学位论文 (1)Microwindows

MicmWindows(http://microwindows.censofl.corn)是一个开放源码的项目, 目前由美国CenturySoftware公司主持开发。MicroWindows是一个基于典型客户 ,服务器体系结构的GUI系统,基本分为三层。最底层是面向图形输出和键盘、 鼠标或触摸屏的驱动程序;中间层提供底层硬件的抽象接口,并进行窗口管理; 最高层分别提供兼容于X Window和Windows CE(Win32子集)的API。该 项目的主要特色在于提供了类似x的客户/服务器体系结构,并提供了相对完善 的图形功能,包括一些高级的功能,比如Alpha混合,三维支持,TrueTypc字体 支持等。然而MicroWindow的图形引擎存在许多问题,可以归纳如下: 1)无任何硬件加速能力. 2)图形引擎中存在许多低效算法,同时未经任何优化。比如在直线或者圆 弧绘图函数中,存在低效的逐点判断剪切的问题。 3)代码质量较差。由于该项目缺少一个强有力的核心代码维护人员,因此 代码质量参差不齐,影响整体系统稳定性。这也是MicroW'mdows长时间 停留在0.89Pre,8版本上的原因。
(2)OpenGUI

OpenGUI(http://www.tutok.sk/fastgl/)在Linux系统上存在已经很长时间了。 最初的名字叫FastGL,只支持256色的线性显存模式,但目前也支持其他显示 模式,并且支持多种操作系统平台,比如MS-DOS、QNx和Linux等等,不过 目前只支持x86硬件平台。OpenGUI也分为三层。最低层是由汇编编写的快速 图形引擎;中间层提供了图形绘制API,包括线条、矩形、圆弧等,并且兼容于
Borland的BGI API。第三层用C.H编写,提供了完整的GUI对象集。OpcnGUI

采用LGPL条款发布。OpcnGUI比较适合于基于X86平台的实时系统,跨平台 的可移植性稍差,目前的发展比较缓慢。
(3)MiniGUI

MiniGUI是一种面向嵌入式系统或者实时系统的图形用户界面支持系统。它 主要运行于Linux控制台,实际可以运行在任何一种具有POSIX线程支持的 POSIX兼容系统上,对中文的支持非常良好。MiniGUI同时也是国内最早出现的 几个自由软件项目之一.MiniGUI的主要特色有:提供了完备的多窗口机制和消

山东大学硕士学位论文

息传递机制;提供常用的控件类;支持对话框和消息框及其它GUI元素,如菜 单、定时器等:通过两种不同的内部软件结构支持低端显示设备和高端显示设备; 支持Windows的资源文件;支持各种流行图像文件;支持多字符集和多字体, 如GB2312,BIG5等,其他字符集也可轻松加入:支持多种汉字输入法,如全拼、 五笔等;针对嵌入式系统的特殊的支持,包括一般性的FO流操作,字节序相关 函数等等。
(4)QtfEmbedded

Qt/Embedded著名的Qt库开发商TrollTech公司发布的面向嵌入式系统的 Qt版本.因为Qt是KDE等项目使用的GUl支持库,因此用户认为有许多基于
Qt的X W'mdow程序可以非常方便地移植到Qt/Embedded版本上6。基于此认

识,自从Qt/Embedded以GPL条款发布以来,有一些嵌入式Linux开发商开始
使用Qt/Embedded.

但是,Qt/Embedded还有一些问题值得开发者注意:

t)Qt/Embedded是一个C什函数库,尽管Qt/Embedded声称可以裁剪到最
少630K,但这时的Qt/Embedded库已经基本上失去了使用价值。低的程 序效率、大的资源消耗也对运行Qt/Embedded的硬件提出7更高的要求。 2)Qt/Embedded库目前主要针对手持式信息终端,因为对硬件加速支持的 匮乏,很难应用到对图形速度、功能和效率要求较高的实时嵌入式系统当 中,比如控制系统、机顶盒、游戏终端等等。 3)Qt/Embedded提供的控件集风格沿用了PC风格。并不太适合许多手持 设备的操作要求。 4)Qt/Embedded的结构过于复杂,很难进行系统裁剪、扩充、定制和移植。 因为上述这些原因,目前所见到的Qt/Embedded的运行环境,几乎是清一色 基于S订ongARM、xScale的iPAQ或者其它高端手持设备。
6.,。2

iliniGUI的技术优势

MiniGUI是针对嵌入式设备的轻量级图形用户界面支持系统,属于一种“嵌 入式图形中间件”软件产品。通过以上对于国内外嵌入式GUI的研究与比较,总 结MiniGUI具有如下几大技术优势:

山东大学硕士学位论文

1)轻型、占用资源少 MiniGUI本身的占用空间非常小,以嵌入式Linux操作系统为例,MiniGUI 的典型存储空间占用情况如下: ●Linux内核; 300K~500K(由系统需求决定)

?文件系统:500K~2MB(由系统需求决定) ?MiniGUl支持库:
500K~700K(由编译选项确定)

●MiniGUI字体、位图等资源:400K(由应用程序确定,可缩小到200K 以内) ●GB2312输入法:200K(不是必需的,由应用程序确定) ●应用程序:1M~2M(由系统决定) 总体的系统占有空间应该在2MB到4MB左右.在某些系统上,功能完备 的M陆GUI系统本身所占用的空间可进一步缩小到IMB以内。最新的研发成 果表明,MiniGUI能够在CPU主频为30 MHz,仅有4M RAM的系统上正常 运行(使用uClinux操作系统)。这是其它针对嵌入式产品的图形系统,比如 MicroWindows或者Qt/Embeddod所无法达到的。 2)高性能、高可靠性


MiniGUI良好的体系结构及优化的图形接口,可确保最快的图形绘制速度。 在设计之初,我们就充分考虑到了实时嵌入式系统的特点,针对多窗口环境下的 图形绘制开展了大量的研究及开发,优化了MiniGUI的图形绘制性能及资源占 用。MiniGUI在大量实际系统中的应用,尤其在工业控制系统的应用,证明 MiniGUI具有非常好的性能。 31可配置 为满足嵌入式系统千变万化的需求,必须要求GUI系统是可配置的。和 Linux内核类似,MiniGUI也实现了大量的编译配置选项,通过这些选项可指定 MiniGUI库中包括哪些功能而同时不包括哪些功能。大体说来,我可以在如下 几个方面对MiIliGUI进行定制配置: ●指定MiniGUI要运行的操作系统。 ●指定运行模式。 ●指定需要支持的GAL引擎和IAL引擎,以及引擎相关选项。

山东大学硕士学位论文

●指定需要支持的字体类型。 ?指定需要支持的字符集。 ?指定需要支持的图像文件格式。 ●指定需要支持的控件类. ?指定控件的整体风格,是三维风格、平面风格还是手持终端风格。 这些配置选项大大增强了MiniGUI的灵活性。对用户来讲,可针对具体应 用需求量体裁衣,生成最适合产品需求系统级软件。 钔可伸缩性强 MiniGUI丰富的功能和可配置特性,使得它既可运行于基于龙珠的低端产 品中,亦可运行于基于ARM9的高端产品中,并使用MiIliGUI的高级控件风 格及皮肤界面等技术,创建华丽的用户界面. 51跨操作系统支持 理论上,MiniGUI可支持任意一个多任务嵌入式操作系统;实际已支持 Linux/uClinux、eCos、uC/OS.Ⅱ、VxWorks、pSOS、ThreadX、Nucleus等嵌入式 操作系统,也可以在W'm32平台上运行。同时,在不同操作系统上的MiniGUI, 提供完全兼容的API接口. 总之,MiniGUI是一个非常适合于实时嵌入式产品的高效、可靠、可定制、 小巧灵活的图形用户界面支持系统。 6.1.3_iniGuI运行模式

目前,MiniGUl支持MiniGUI-Threads、MiniGUI-Lite、MiniG饥.Standalone
三种运行模式,不同的运行模式具有不同的特点和不同的应用场合:

?MiniGUI-Threads运行在MiIliGI,埘鹏ads上的程序可以在不同的线程
中建立多个窗口,但所有的窗口在一个进程或者地址空间中运行。这种运 行模式非常适合于大多数传统意义上的嵌入式操作系统,比如uc/os.Ⅱ、 eCos、VxWorks、pSOS等。当然,在Linux和uClinux上,MiniGUI也 能以MiniGUI-Threads的模式运行。 ?MiniGUI.Lite和MiniGUI.Threads相反,MiIliGUI.“te上的每个程序 是单独的进程,每个进程也可以建立多个窗口。MiniGUI-Lite适合于具

6l

山东大学硕士学位论文

有完整UNIX特性的嵌入式操作系统,比如嵌入式Linux。 ●MiniGUI-Standalone。这种运行模式下,MiniGUI可以以独立进程的方 式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能 单一的应用场合。比如在使用uClinux的嵌入式产品中,因为各种原因而 缺少线程支持,这时就可以使用MiniGUI-Standalonc来开发应用软件。 一般而言,MiniGUI-Standalone模式的适应面最广,可以支持几乎所有的操 作系统,甚至包括类似DOS这样的操作系统;MiniGUI-Threads模式的适用面 次之,可运行在支持多任务的实时嵌入式操作系统,或者具备完整UNIX特性 的普通操作系统;MiniGUI-Lite模式的适用面较小,它仅适合于具备完整UNIX 特性的普通操作系统。

6.2配置、编译、安装MiniGUI
MiniGUI的源代码和资源包可以直接从http:llwww.minigui.com/ download/cindex.shtml下载,MiniGUI相关的文件如下所列: ●Hbminigui.1.6.0.tar.gz:MiniGUI函数库源代码,其中包括
libmimgui、libmgcxt和iibvcongui?

●minigui-rcs-1.6.0.tar.gz:MiniGUI所使用的资源, 图标、位图和鼠标光标。 ●rode.1.6.0.tar.gz:MinIGUI的综合演示程序。
?rag-samples-1.6.0.tar.gz
6.2.1

包括基本字体,

MiniGUI的简单示例程序包。

MiniGUI配置选项 MiniGUI实现了大量的编译配置选项,通过这些选项可指定MiniGUI库中

包括哪些功能丽同时不包括哪些功能,实现最适合产品需求系统级软件库。 MiIliGUI的配置分为两个阶段:第一阶段是在编译前确定的,第二阶段是在运行 时确定的。MiniGUI编译前是通过在源代码根目录下指定; ./configure【option][vat=value]来确定配置选项,其配置选项可分为通用选 项和MiniGUI选项‘”】,特别地,MiniGUI提供内建资源选项,使程序程序运行 时不再需要MiniGUI系统资源文件和配置文件。在MiniGUI应用程序启动运 行时,MiniGUI优先查找用户主目录下的MiniGUI.cfg文件,其次是_/usr/locaYetc/

山东大学硕士学位论文

MiniGUI.efg,最后是/etc/MiniGUI.cfg文件.修改MiniGUI.c龟文件可以改变 MiniGUI运行时的配置选项。MiniGUI的具体配置如下:
./configure—prefix=/opt/host/army41/、

--Imild=i386-Iinux|
——矗Dst=army41—Ⅱ旃nowu—linux l

—target2啪v411lnkno-rrlinux、
一disable一1ite\
——enable-newgal、

——en曲le—incoreres、
——enable-uparm2410ial、 ——enable—cursor、

~disable—supportl2bpp、
一dis曲ler-qvfbial、 udisable-qpfsupport\ —-dis曲le-ttfsupport\

mdisable—typelsupport|
一dis曲le—gbksupport\ 一disable-bi95support\ 一dis曲le-unicodesupport\ —disable—imegb2312\ 一dis曲le—imegb2312py、 --dis曲le-aboutdlg\ 一dis曲le-savescreen\ 一disable一1ibvcongui

6.2.2编译、安装MiIliGUI 配置完成之后,输入命令make就可以对MiniGUI进行交叉编译。只要指 定编译器CC=arm.1inux.gcc,编译MiniGUI所使用的编译工具、头文件、函数 库,都将来自交叉编译环境/opt/host/armv41,而不是主机的,I埘目录。nlake编 译完成之后,使用inakc install把MiniGUI的函数库和头文件以及配置文件等资 源被安装到交叉编译环境中。 在嵌入式系统开发过程中,在编译完MiniGUI和应用程序之后,需要把 MiniGUI库、资源和应用程序拷贝到为目标系统准备的文件系统的相应目录中, 然后使用相关的工具生成目标映像,再下载到目标板上运行。由于配置MiIliGlm 时选择嵌入资源(--enable-incoreres),MiniGUI运行需要的一些位图、图标和字 体等资源将被编译到代码中,就不再需要安装资源文件。

山东大学硕士学位论文

6.3基于MiniGUl状态显示界面设计
6.3.1_inlGuI的消息和消息处理 MiniGUI应用程序通过接收消息来和外界交互。消息由系统或应用程序产 生,系统对输入事件产生消息,系统对应用程序的响应也会产生消息,应用程序 可以通过产生消息来完成某个任务,或者与其它应用程序的窗口进行通讯. MiIliCuI是消息驱动的系统,一切运作都围绕着消息进行。 在MiniGUI的窗口(包括主窗口和子窗口在内)生存周期当中,有几个重 要的消息需要仔细处理。下面描述这些消息的概念和典型处理: ?MSG_CREATE,该消息在窗口成功创建并添加到MiniGUI的窗口管理 器之后发送到窗口过程。这时,应用程序可以在其中创建子窗口和窗口 的其他控件。如果该消息返回非零值,则将销毁新建的窗口。 ?MSG_ERASEBKGND。当系统需要清除窗口背景时,将发送该消息到 窗口过程。在应用程序调用InvalidateRect或者UpdateWindow等函数并 为Erase参数传递TRUE时,系统将发送该消息通知窗口清除背景。默认 窗口过程将以背景色刷新窗口客户区.某些窗口比较特殊,往往在 MSG._PAINT消息中重绘所有的窗口客户区,就可以忽略对该消息的处 理。还有一些窗口希望在窗口背景上填充一个图片,则可以在该消息的 处理中进行填充操作。
?MSG

MiniGUI

通过判断窗口是否含有无效区域来确定是否需要重绘。当窗口在初始显 示、从隐藏状态变化为显示状态、从部分不可见到可见状态,或者应用 程序调用InvalidateRect函数使某个矩形区域变成无效时,窗口将具有 特定的无效区域。这时,MiniGUI将在处理完所有的邮寄消息、通知消 息之后处理无效区域,并向窗口过程发送MSG PAINT消息。 应用程序必须及时处理投递到它的消息队列中的消息,程序一般在 MiniGUIMain函数中通过一个消息循环来处理消息队列中的消息。消息循环就是 一个循环体,在这个循环体中,程序利用GetMessage函数不停地从消息队列中 获得消息,然后利用DispatchMessage函数将消息发送到指定的窗口,也就是调 用指定窗口的窗口过程。并传递消息及其参数。绝大多数的窗口过程只处理几种

山东大学硕士学位论文 类型的消息,其它的大部分消息则通DefaultMainWinProc函数交由系统处理。 系统把消息发送给应用程序窗口过程,窗口过程有四个参数:窗口句柄

hwnd、消息标识message以及两32的消息参数—wP猢和IParam。窗口旬柄
指明了接收消息的目标窗口,而消息标识是~个整数常量,由它来标明消息的类 型。窗口过程接收到一条消息,它就通过消息标识来确定消息的类型以及如何处 理。消息的参数对消息的内容作进一步的说明,对其他不同的消息类型来讲, wParam和IParam也具有明确的定义。 8。3。2数据显示界面设计 利用MiniGUI提供的丰富的控件资源,在目标平台上实现了数据、实时图 像的综合显示界面。数据显示程序的设计思想是:通过MiniGUI的定时器每50ms 采集一次AdD转换器的数据进行转化后在窗口中显示,同时在主线程中创建图 像采集线程,负责将摄像头采集的数据保存成.[PEG格式的图像并向主线程发送
MSG ERASEBKGND消息,主线程收到MSG ERASEBKGND消息后加载图像

文件,在窗口的指定区域显示图像。采用在MSG ERASEBKGND消息中来加载 图像的方案,会用前一张图片作为刷新屏幕时的填充背景图片。这样就保证了 LCD上图像的连续性。程序的流程图如图6.1所示:

图6.1数据显示程序流程图

U东大学硕士学位论文

其中,MiniGUI的程序入口点是MiniGUIMain函数,系统初始化后就会自 动找到该函数。每个MiniGUI应用程序的初始界面一般都是一个主窗口,通过 调用CreateMaingrmdow函数来创建一个主窗口,其参数是一个指向 hdAINWINCREArE结构的指针Createlnfo。MAINWINCREATE结构描述一个主 窗口的属性,在创建主窗口之前需要设置Createlnfo的各项属性。创建主窗口后, 还需要调用ShowW'mdow函数才能把所创建的窗口在屏幕上显示。MiniGUI为 每一个MiniGUI程序维护一个消息队列。在发生事件之后,MiniGUI将事件转 换为一个消息,并将消息放入目标程序的消息队列之中。主线程通过如下代码进
行消息循环: while(GetMessage(&Msg,hMainWnd))( TranslateMessage(&Msg); DispatchMessage(&Msg);

, 在这个循环体中,程序利用GetIⅥessage函数不停地从消息队列中获得消息, 然后利用DispatchMessage函数将消息发送到指定的窗口,也就是调用指定的窗 口的窗口过程,并传递消息及其参数。 窗口过程函数主体上都是switch和case结构的选择语句,针对不同的消息 产生不同的响应。数据显示程序中主窗口的各个控件、子窗口的创建、定时器的 启动就是在MSG CREATE消息处理代码中实现。而A/D转换器的数据的显示 则是在MSG_TIMER消息处理代码中实现,具体方法是循环读取三路A/D转换 器数据,进行数据处理转化,最后输出到主窗口相应的静态框中。 主线程和图像采集子线程间的同步工作通过条件变量和互斥锁来实现,在主 线程读取文件时,图像采集线程将处于阻塞状态,直到主线程文件读取结束。整 个数据显示程序结构合理,运行状态良好,实现了A/D转换器数据和图像的实 时显示。

山东大学硕士学位论文

结束语
随着信息技术的飞速发展,人类将进入全新的数字时代,数字化产品会空前 繁荣,嵌入式系统也必将被应用于空前广泛的领域,同样地新的嵌入式Linux系 统也会不断地出现,因此深入研究嵌入式Linux技术是一件非常有价值的事情. 本文研究的是在以¥3C2410为核心的硬件平台上移植一个Linux系统,涉及 很多计算机操作系统方面的内容。需要对操作系统有清晰的认识,熟悉Linux系 列开发工具的使用,熟悉Linux的运行机制和配置管理。在嵌入式Linux系统移 植中,目前完成的研究工作主要包含以下内容: ●研究了系统引导程序原理,分析系统引导程序vⅣI的结构和工作原理, 最终完成VIVI向目标平台的移植。 ●研究了Linux内核架构和启动流程,ARM Linux内核移植及配置编译的 具体方法和过程。 ●研究了Linux根文件系统的架构标准以及如何构建根文件系统的内容, 研究如何根据目标平台的存储器选择并实现多文件系统. ?研究了Linux驱动程序组织结构和原理,实现了CAN设备驱动程序。 ●研究了MiIliGUI在嵌入式Linux上的配置、编译和安装MhfiGUI。 嵌入式Linux技术在不断地发展前进,在本研究工作的基础上,还有许多方 面的工作可以继续加以研究并不断深化: ?内核的最小化裁减的研究:本研究工作得到的压缩内核映像大小在IMB 左右,可以再仔细设置内核配置选项,研究内核的裁减技术,可以达到 更好的尺寸要求,以满足嵌入式系统尽量节约资源的准则。 ●采用2.6版本新内核:Linux 2.6内核在2.4版本的基础上又提供许多新 的特性,为其在嵌入式领域的应用提供了强有力的支持,新的内核越来 越多的应用到嵌入式Linux领域将是必然的趋势。 嵌入式Linux的应用领域已经涵盖了从工业过程控制、军事电子设备、航空 航天到消费类电子产品、网络通信设备等人们生活的各个领域,研究嵌入式Linux 技术在新的时代必将大有作为。

山东大学硕士学位论文

参考文献
【l】李善平等.Linux与嵌入式系统【M】.北京:清华大学出版社,2002:126-131. 【2】Jonathan
Third Corbet,Alessandro Rubin&Greg Kroah-Hartman,Linux Device Drivers,

Edition[M],0’Reilly,2005.
Linux

【3】Karim Yaghmour.Building Embcdded

Systems[M].O'Reilly,2003.

【4】陈雷,钟书毅译.嵌入式Linux-硬件、软件与接12[M】.电子工业出版社,2003. 【5】邹思轶.嵌入式Linux设计和应用【M】,清华大学出版社,2002.

【6】毛德操,胡希明.L/nux内核源代码情景分析[M】斯江大学出版社,2001.
忉毛德操,胡希明.嵌入式系统【M】.浙江大学出版社,2003.
【8】刘峥嵘,张智超等.嵌入式Linux应用开发详解[M】.机械工业出版社,2004. 【9】王学龙.嵌入式Linux系统设计与应用【M】.清华大学出版社,2001. 【lO】杜春雷.ARM体系结构与编程【M】.清华大学出版社,2003. 【11】ARM Limited.ARM920T Technical
Reference

Manual.ARM Limited 2001.

【12】北京飞漫软件技术有限公司MiniGUI技术白皮书. 【13】北京飞漫软件技术有限公司M缸GUI用户手册. 【14]北京飞漫软件技术有限公司MiniGUI编程指南. 【15】魏永明,骆刚译.Linux设备驱动程序(第二版).中国电力出版社2002. 【16】詹荣开.嵌入式Boot Loader技术内幕.
http://www.ibm.com/developerworks/cn/linux/I-btloader/index.hunl

【17】刘军芳,李众立,胡和智.基于s3c2410开发板的Boot Loader的启动分析 忉.‘微计算机信息》(嵌入式与soc).2006,22(6-2):201-203. 【18】陶雪丽,李宝方,徐海.具有网络和双启动功能的¥3C2410 实现叨.河南机电高等专科学校学报.2005,13(6):33~34.
【19】Rusty Russell,Daniel
Standard Boot

Loader的

Quinlan&Christopher Yeoh.Filesystem
Group,2004.

Hierarchy

v2.3[J】.Filesystem Hierarchy Standard

[20】Russell King.Kernel

Memory Layout on ARM Linux.

http://www.arm.1inux.org.uk/developer.2003

【21】BOSCH.CAN Specification(version 2.o).1991
68

山东大学硕士学位论文 [22】SAMSUNG
S3C2410A USER’S

MAⅫIAI.,2003.

[23】MICROCHIP.MCP2510 DATASHEET,2004.

【24]董士海.用户界面的今天和明天【J】.计算机世界.1997,(7):26,-,28. 【25】金西,黄汪.嵌入式Linux技术及其应用[J】.计算机应用.2005,20(7):40--42. 【261张海峰,张宏海,张土平.嵌入式Linux系统叨.微计算机信息(测控自动化).
2004,20(1):65,-,.66.

【27]杨波,徐成,李仁发.嵌入式Linux上的CAN设备驱动程序的设计[J】.科学技 术与工程,2004.4(12):1021~1022. 【28】杨伟,段晓峰等.嵌入式网关中CAN接口的设计与实现们.仪器仪表用户,
2005.12(6):137-138.

【29]田志刚.嵌入式Linux及其应用研究fJ】.微计算机应用.2003,24(5):289--295. 【30】王集森,刘吴,胡晨.嵌入式Linux中多文件系统的构建[J】.单片机与嵌入式 系统应用.2003,(12):12—14. 【3l】王梅.Linux系统对多种文件系统支持的探讨fJ】.湖南工程学院学报
2003.(4):75-77.

【32]郭其一,丁豪杰,邹洁.基于MiniGUI的列车状态信息人性化平台实现阴. 工业控制计算机.2004,17(3):1-2. 【33】潘明泉,张侃谕.嵌入式Linux下基于MiniGUI的信息终端软件开发【J】.单 片机与嵌入式系统应用.2003,(1):29-33. 【34】黑新宏,崔杜武,常斌.基于MiniGUI的客户端PDA的研究及开发【J1.计 算机应用.2003,23(4):75-77. [35】杨大鹏,汪小燕,连晓平.嵌入式Linux下基于MiniGLrl的多媒体实验系统 的软件实现[刀.科技资讯.2006,(3):34-.,35. 【36】陈剑雄,林述温,倪霞林.MiniGUI在数控系统图形界面中的应用田.工具 技术.2006,40(6):42,-46. 【37】纪竞舟,付字卓.基于ARM LINUX的嵌入式GLrl的研究和移植田.计算机 仿真.2004,22(3):224-227. 【38】李明.ARM Linux的移植过程及分析【刀.电子设计应用,2003,(7):55-57 【39]Liu
Jtmliang,Pan Gang,Li Ping.Embedded Linux Graphic Terminal Design

Based On

ARM.Procecdillgs ofthe 25th

Chinese Control Conference.Aug.2006

山东大学硕t学位论文 Page(s):1921-1925.

[40】Lermon.Embedding
Page(s):33—07.

Linux.IEE Review.Volume 47,Issue

3。May

2001

[41】http://kegel.com/crosstool/current/doc/crosstool-howto.hunl 【42】ARM Limited.ARM
Architecture Reference

Manual.ARM Limited

2000.

【43】张静,叶梧,冯穗力.基于ARM920T的嵌入式Linux系统开发田.现代电子
技术.2005,(4):22-24.

【44】周国华,陆德波,朱荆洲.基于Linux的嵌入式应用开发策略叨.计算机与数 字工程.2005,(3):42--45. 【45】赵志显.基于Linux的嵌入式系统设计们.大众科技.2005,(11):108-,110. 【46】张盛,曾鹏.嵌入式Linux在移动设备中的应用田.中国数据通信.2004,
0):41-44.

f47]刘殿敏,李科杰.基于PXA250和Linux嵌入式系统在机器人遥操作中的设 计与实现[刀.计算机系统应用.2004,(5):44,-47 [48】陈珏.基于嵌入式Linux系统的应用程序开发田.福建电脑.2004,(6):64. 【49】霍妍,盂凡荣.基于Linux嵌入式系统的研究与实现[J】.计算机系统应用.
2004,(s):4-6.

【5I阳程旭.嵌入式Linux技术探讨田.混合微电子技术.2005,(2):43--47. 【5l】宁志新,温建春,李海军.嵌入式Linux关键技术研究阴.齐齐哈尔大学学 报.2004。20(3):63--65.

山东大学硕士学位论文

致谢
首先,我要深深地感谢导师李贻斌教授。在三年研究生学习期间,李老师从 各方面都给了;我极大的关怀和悉心的教导。李老师严谨求实的治学态度、渊博的 专业知识给我留下了深刻的印象,使我在研究工作中受益匪浅。在此论文完成之 际,谨向李老师致以深深的敬意和最由衷的感谢! 同时,我还要深深地感谢宋锐老师,谢谢宋老师三年来在学习和生活上对我 的教导和关心,和宋老师一起愉快的学习、生活使我受益匪浅,终生难忘。感谢 同实验室的荣学文老师、周凤余老师、马听老师。还要感谢王小朋、汤晓、柴汇、 张娟同学、牛君、李彩虹师姐、宋洪军、潘为刚师兄,谢谢他们对我学习和生活 提供的支持和帮助,我将永远怀念一起度过的美好时光。感谢我的室友和好友杨 东营、韩修恒、冯海川,三年一起度过的美好生活永远值得怀念。感谢三年来所 有给我关心和帮助的老师和同学。 最后,我还要感谢我的父母,他们给予我的爱与无私的支持,是我无法用言 语表达、终生难以回报的。

LJJ东大学硕士学位论文

攻读学位期间发表的学术论文目录
1、王彦堂,李贻斌,宋锐基于ARM Linux平台的CAN设备驱动程序设计 与实现计算机工程与应用已录用待发表 2、汤晓,李贻斌,王彦堂,张娟基于Mapinfo的摄短路径混合搜索算法.山 东理工大学学报(自然科学版)2006.3
Vol+20 No.2

基于ARM的嵌入式Linux系统研究与应用
作者: 学位授予单位: 王彦堂 山东大学

相似文献(10条) 1.学位论文 黄应江 基于Intel PXA255处理器的嵌入式Linux移植与USB驱动设计 2006
嵌入式系统是一个快速发展的领域。嵌入式系统的研究内容涉及到计算机学科的各个方面。目前主要关注的应用领域是网络系统、无线网络、3G应 用、消费电子等。主要的技术热点包括嵌入式操作系统、系统芯片设计、应用软件开发和各种服务性的研究工作。本论文研究了嵌入式系统的体系结构 和发展状况,分析ARM处理器的工作模式,寄存器的设置和分配,讨论和分析了嵌入式系统IntelPxA255微处理器和本研究中用到的嵌入式Linux操作系统 ARM Linux。嵌入式操作系统的移植工作要根据目标系统的需求,确定移植所需要修改的文件及需要添加的设备驱动程序。Linux移植是一个综合性很强 的技术工作。嵌入式系统根据需求的不同,其软/硬件都是可定制的,其启动引导也各不相同,这是嵌入式系统设计的难点和重点之一。在实验室自行设 计的基于PXA255处理器芯片的目标板上,本课题进行了ARM Linux系统的移植研究工作,包括Linux2.4.18内核移植、文件系统移植以及引导程序 bootloader的编程开发。 通用串行总线(USB)是一种高传输速率的串行接口总线,由于它具有即插即用、易于扩展和高传输速率的特点,因此现在被广为应用于各种计算机外 设、数字设备以及工业领域之中。本课题设计的目标之一是使实验室自行设计的基于PXA255处理器的目标板支持USB2.0主机通信,可以外接USB设备。由 于Linux2.4.18的USB子系统只支持USB1.1协议,所以有必要对USB子系统进行修改、升级。本文简要叙述了USB的总线特点、软硬件结构和USB2.0协议。 然后从USB核心和主机控制器驱动的实现两个方面对Linux下USB子系统进行了分析。在前面分析的基础上,并根据嵌入式Linux系统的需求,完成了 Linux下USB子系统的设计。 USB是一个庞大复杂的协议,作为一种总线,它为系统访问大量外部USB设备提供了通道,可见USB驱动在系统中的重要性。因此,USB驱动的正确设 计需要深入细致的研究工作。 本课题的设计方案和理论分析为后续研究和开发打下了基础,并为其他后续嵌入式USB设备应用的开发提供了参考。

2.学位论文 谌勇辉 基于FPGA的嵌入式快速样机平台软件设计 2006
随着工业的发展

相关文档

基于ARM的嵌入式Linux系统移植技术研究与应用
基于ARM的Linux嵌入式系统移植的研究与应用
基于ARMLinux平台的嵌入式信息管理系统的研究与实现
Linux在嵌入式系统中的应用
基于ARM_Linux的嵌入式图形系统研究
基于ARM的嵌入式Linux网络通信平台的研究和应用
基于ARM的嵌入式Linux操作系统移植的研究
基于ARM与实时Linux的嵌入式数控铣床系统研究
ARM嵌入式Linux系统的研究与实现
基于ARM9和Linux操作系统的嵌入式应用开发
电脑版