面向智能手机的嵌入式软件系统的研究与开发.doc_第1页
面向智能手机的嵌入式软件系统的研究与开发.doc_第2页
面向智能手机的嵌入式软件系统的研究与开发.doc_第3页
面向智能手机的嵌入式软件系统的研究与开发.doc_第4页
面向智能手机的嵌入式软件系统的研究与开发.doc_第5页
免费预览已结束,剩余94页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上海市科技发展基金项目面向智能手机的嵌入式软件系统的研究与开发(项目编号:04dz15012)技术报告上海分布计算技术中心2006年7月5日目 录1前言12智能手机硬件开发平台12.1智能手机处理器12.2通讯模块12.3其他外围设备13智能手机的软件平台设计24智能手机操作系统24.1Linux概述24.2嵌入式Linux移植64.3Jffs2文件系统实现174.4关键技术215智能手机嵌入式GUI225.1Qtopia 平台介绍235.2移植Qtopia PDA到开发板235.3关键技术256智能手机中间件266.1Java技术概述266.2J2ME概述266.3CLDC概述276.4MIDP概述286.5KVM技术296.6J2ME中间件平台典型应用分析306.7关键技术317嵌入式数据库367.1智能手机中数据库需求分析367.2嵌入式数据库概述377.3Berkeley DB 概述377.4Berkeley DB 移植387.5嵌入式数据库在智能手机中的应用387.6关键技术418智能手机系统服务418.1GSMLib库418.2Wap-Client实现498.3GSM/GPRS 服务进程518.4关键技术539智能手机基本应用6010主要功能和性能6011技术展望61感 谢62面向智能手机的嵌入式软件系统的研究与开发1前言随着智能手机的发展,功能会越来越多。除了具有手机基本的通话、收送信息等功能,还能上网、收发邮件、拍照、录像、看电影、欣赏MP3音乐等。这就需要智能手机不仅具有高性能的嵌入式处理器,更侧重于系统软件平台的稳定性、可移植性、可扩展性。本智能手机项目的目标是研究与开发基于嵌入式Linux的智能手机软件平台,包括嵌入式Linux操作系统、处理手机业务及其他业务的系统服务、嵌入式图形用户接口、嵌入式数据库、智能手机中间件、智能手机基础应用软件等。2智能手机硬件开发平台本智能手机在硬件设计上采用Intel公司的基于XScale核的pxa272高性能嵌入式处理器、展讯公司的SM5100B通讯模块、flash、LCD、触摸屏等实现一个完整的智能手机硬件开发平台。2.1智能手机处理器智能手机比普通手机具有更高的性能,关键在于智能手机处理器的性能,普通手机选用基于ARM7 或 ARM9核的处理器,运行频率只有几十或一百多MHz,处理手机基本功能还行,处理媒体播放等性能显得远远不够,随着智能手机的发展,需要高性能的智能手机微处理器。本智能手机硬件开发平台选用Intel公司的基于XScale核的pxa272高性能嵌入式处理器,最高主频可达520 MHz。XScale核采用ARM V5TE架构,是Intel公司的SrongARM的升级换代产品。它具有高性能、低功耗等特点。XScale在StrongARM的基础上,对几个方面作了改进。它实现了7级超级流水线。为适应新的程序,还增加了8条指令以提高效率。另外,还新增2KB小型数据Cache和小型指令Cache。新增分支目标缓冲器BTB,支持动态指令与分支预测。PXA272 广泛应用于PDA、智能手机、MP3 等产品中。2.2通讯模块本智能手机系统选用展讯公司的SM5100B通讯模块,该模块包含了基带芯片、RF射频芯片组、Combo Flash 芯片以及GSM/GPRS终端所需的全部软件功能。SM5100B有着完善的功能和稳定的性能,另外具有非常小的外形尺寸和非常轻的重量,能够满足智能手机、数传设备等无线终端设备的薄、轻、小巧需求。SM5100B是四频GSM模块(GSM850/900/1800/1900MHz)。支持GPRS Class 10,支持16和弦/32和弦和真人真唱,支持标准AT命令控制。具有语音功能、SMS信息、数据功能、GSM增值服务以及其它等功能。2.3其他外围设备智能手机的其他外围设备包括USB、Flash、LCD显示屏、触摸屏、红外、小键盘、摄像头、扬声器、麦克风等。3智能手机的软件平台设计智能手机的软件设计是智能手机系统实现的关键难点,设计的优劣直接关系到系统的稳定性、可移植性、可扩展性。本智能手机系统设计将软件分为四层结构,如图1所示。基本手机应用扩充/第三方应用嵌入式GUI智能手机中间件浏览器嵌入式数据库系统服务层操作系统层硬件层图1 智能手机嵌入式软件系统层次结构最底层是操作系统层,主要实现对嵌入式Linux的移植、裁剪,以及Linux的快速启动和电源管理等。第二层是系统服务层,处理手机业务以及其他服务。第三层是智能手机图形接口以及智能手机中间件系统层,嵌入式GUI实现人机接口交互,中间件支持java程序和游戏的下载与运行。最上层是智能手机基本应用及其他应用软件层,实现手机的基本功能及其他应用程序等。4智能手机操作系统智能手机的操作系统是各个手机厂商竞争的关键,目前手机市场主流的三大操作系统:Symbian、Windows CE、Linux。Linux凭借其自由、免费、开放源代码的优势在手机操作系统市场中异军突起,其特点主要有:内核高效稳定、公开源代码、可移植性、可裁减、支持多任务等。本智能手机操作系统采用Linux操作系统,主要实现嵌入式Linux的移植、裁剪,并结合XIP技术实现Linux的快速启动,解决电源管理问题等。4.1Linux概述Linux是一种可以运行在PC机上的免费的UNIX操作系统。它是由芬兰赫尔辛基大学的学生Linus Torvalds在1991年开发出来的。今天Linux已发展成一个功能强大的操作系统。Linux的开发以及它的源代码是在GNU(General Public License一般公共许可)的保护下的。它们对每个人都是完全免费的。Linux有着广泛的用途,包括网络,软件开发,用户平台等。Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。4.1.1进程调度进程调度(SCHED)控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。进程调度原则 调度实现方式:周期性时间中断。Linux的时钟中断每隔10ms发生一次。时钟中断处理例程就是进行进程的重新调度。因此至多每隔10ms的周期,进程管理器(函数schedule())就会被调用。调度优先级:(1) 中断(硬件支持)(2) 当前的核心态进程(3) 其他核心态进程(4) 用户进程用户进程的优先级分类 (1)实时进程 (2)交互进程:视为IO bound进程 (3)批处理进程:视为CPU bound进程具体描述: (1) 中断可以抢占核心进程,但必须保证在中断处理结束后返回它。一个核心态进程可以禁用它所运行的处理器上的中断,从而保证不会被中断请求信号中断它的运行。(2) 核心态进程不可抢占中断处理进程。中断处理期间,仅仅是在中断处理进程处理完成或其他被允许的中断发生时候才发生任务切换。(3) 核心态进程不可抢占其他核心态进程。除非一个核心态进程自愿睡眠,否则不能切换到别的进程。这保证了核心代码块的对其他进程的整体性,大大的简化了核心保护机制。特点:核心态进程是非抢占,用户态进程是抢占的。 优点:核心数据的同步和保护机制比较简单。 缺点:不能很好的支持响应速度要求高的实时应用。进程调度依据 系统优先级: 动态优先级:计算goodness值。 时间片(slice/jiffies/quantum): 时间片的选择原则:在响应速度满足要求的的情况下尽量选择较大的时间片,减少系统开销。进度调度算法(1) 直接启动 发生在当前进程因等待资源而需要进入被阻塞状态时。调度程序执行的步骤如下: 1、把当前进程(全局变量current指向的task_struct变量)放到适当的等待队列里; 2、把当前进程的state设为TASK_INTERRUPTIBEL或者TASK_UNINTERRUPTIBEL; 3、调用schedule(),准备让新的进程掌握CPU; 4、检查当前进程所需的资源是否可用,如果是,则把当前进程从等待队列里删除,否则回到第2步。(2)被动调用 通过在当前进程的need_resched设为1,就可以实现另一种方式重新调度各个进程。因为每次调入一个用户态进程之前,这个变量的值都会被检查,因此schedule()又会很快被调用。 被动调用在以下情况下执行: 当当前进程用完了它的CPU时间片,update_process_times()重新进行计算。当一个进程被唤醒,而且它的优先级比当前进程高。wake_up_process()调用reschedule_idle(),设置当前进程的need_resched,使被唤醒的进程尽快掌握CPU。当sched_setschedler()或sched_yield()系统调用被调用的时候。4.1.2内存管理内存管理(MM)允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。 虚拟内存可以是系统中实际物理空间的许多倍。每个进程运行在其独立的虚拟地址空间中。这些虚拟空间相互之间都完全隔离开来,所以进程间不会互相影响。同时,硬件虚拟内存机构可以将内存的某些区域设置成不可写。这样可以保护代码与数据不会受恶意程序的干扰。 内存映射技术可以将映象文件和数据文件直接映射到进程的地址空间。在内存映射中,文件的内容被直接连接到进程虚拟地址空间上。 内存管理子系统允许系统中每个运行的进程公平地共享系统中的物理内存。 尽管虚拟内存允许进程有其独立的虚拟地址空间,但有时也需要在进程之间共享内存。 例如有可能系统中有几个进程同时运行BASH命令外壳程序。为了避免在每个进程的虚拟内存空间内都存在BASH程序的拷贝,较好的解决办法是系统物理内存中只存在一份BASH的拷贝并在多个进程间共享。动态库则是另外一种进程间共享执行代码的方式。共享内存可用来作为进程间通讯(IPC)的手段,多个进程通过共享内存来交换信息。 Linux支持SYSTEM V的共享内存IPC机制。4.1.3进程间通信进程间通讯(IPC) 支持进程间各种通信机制。Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来。图2 Linux所继承的进程间通信其中,最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵循POSIX标准; linux下进程间通信有以下几种方式:(1) 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;(2) 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);(3) 消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。(4) 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。(5) 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。4.1.4网络接口网络接口(NET)提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。 本智能手机Linux操作系统支持Tcp、IPv4、IPv6,irDA、USB等网络协议。4.1.5文件系统虚拟文件系统(VirtualFileSystem,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。 处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统以相似的理由依赖于进程调度。 各个子系统之间的依赖关系如下: 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。 进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。 虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。 4.2嵌入式Linux移植4.2.1Linux移植准备 所谓Linux移植就是把Linux操作系统针对具体的目标平台做必要改写之后,安装到该目标平台使其正确的运行起来。这个概念目前在嵌入式开发领域讲的比较多。其基本内容是:获取某一版本的Linux内核源码,根据我们的具体目标平台对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动,打造一款适合于我们目标平台(可以是嵌入式便携设备也可以是其它体系结构的PC 机)的新操作系统,对该系统进行针对我们目标平台的交叉编译,生成一个内核映象文件,最后通过一些手段把该映象文件烧写(安装)到我们目标平台中。而通常对Linux源码的改写工作难度较大,它要求你不仅对Linux内核结构要非常熟悉,还要求你对目标平台的硬件结构要非常熟悉。同时还要求你对相关版本的汇编语言较熟悉因为与体系结构相关的部分源码往往是用汇编写的。所以这部分工作一般由目标平台提供商来完成。比如说针对目前嵌入式系统中最流行的ARM平台,它的这部分工作就是由英国ARM公司的工程师完成的,我们所要做的就是从其网站上下载相关版本Linux内核的补丁(Patch)。把它打到我们的Linux内核上,再进行交叉编译就行。其基本过程是这样的(以Linux2.6. 9 为例): 1)到.uk上下载Linux2.6.9内核及其关于ARM平台的补丁 2)给Linux2.6.9打补丁 3)准备交叉编译环境。交叉编译环境工具链一般包括binutils(含AS汇编器,LD链接器等), arm-gcc,glibc等。交叉编译环境的搭建也是个复杂的过程。 4)修改内核目录下的makefile文件,主要是以下几行: 注释掉ARCH:=$(shell unamem | sed e s/i.86/i386/-e s/sun4u/sparc64/ -es/arm. */arm/ - e s/sa110/arm/)这一行。 ARCH := 改为 ARCH := armCROSS_COMPILE := 改为 CROSS_COMPILE = 你的交叉编译工具中arm-linux 所在目录/arm-linux例如:CROSS_COMPILE = /opt/crosstool/arm-linux/bin/arm-linux- 5)此后就可以进行编译。 6)以上可以使你的目标板上跑起linux系统,但是你的嵌入式目标板上的一些硬件还没有驱动起来,这需要你编写相应的硬件驱动程序。4.2.2交叉编译环境 交叉编译环境的建立最重要的就是要有一个交叉编译器。所谓的交叉编译就是:利用运行在某机器上的编译器编译某个源程序生成在另一台机器上运行的目标代码的过程。编译器的生成依赖于相应的函数库,而这些函数库又得依靠编译器来编译,所以这里有个“蛋和鸡”的关系,所以最初第一的版本的编译器肯定得用机器码去生成,现在的编译器就不必了。这里我主要用到的编译器是arm-linux-gcc, 它是gcc的arm 改版。gcc是个功能强大的c语言编译工具,其年龄比Linux还长。无论编译器的功能有多么强大,但它的实质都是一样的,都是把某种以数字和符号为内容的高级编程语言转换成机器语言指令的集合。编译工具的基本结构如下图3所示:图3 编译工具的基本结构编译器通常用机器语言或汇编语言编写而成,当然也可以用其它一些高级语言编写。编译过程中,编译器把源程序的各类信息和编译各阶段的中间信息保存在不同的符号表中,表格管理程序负责构造,查找和更新这些表格。错误处理程序主要功能是处理各个阶段中出现的错误。编译过程中,仅有一个编译器是不行的,还必需和其它的一些辅助工具联合,才能工作。这些辅助编译工具主要有: 1)解释程序(Interpreter):它本身与编译器类似也是一种语言翻译工具,它直接执行源程序,尤其是一些脚本语言程序,其有点是简单,好移植,但执行速度与编译好的目标代码相比就要慢许多。 2)汇编器(Assembler):它是用于特定计算机上的汇编语言翻译程序。 3)连接器(Linker):其作用是把在不同的目标文件中编译或汇编的代码收集到一个可直接执行的文件中。同时它也把目标程序和标准库函数的代码相连。 4)装载器(Loader):编译器,汇编器及连接器所生成的代码经常还不能直接执行。它们的主要存储器访问可以在存储器的任何位置,只是在逻辑上相互之间存在一个固定的关系,最终位置的确定和某个起始位置相关。通常这样的代码是可复位位的。装载器可处理所有与指定的基地址或起始地址相关的可复位位的地址。这样使得代码的编译更加灵活。 5)预处理器:它是在编译开始时由编译器调用,专门负责删除注释,包含其它文件以及执行宏替换的。 6)调试器:调试器用于对目标代码的调试,从而达到排除代码中存在的错误。 目前交叉编译技术有两种典型的实现模式,它们分别是:Java模式即Java 的字节码编译技术和GNU GCC 模式即通常所说的Cross GCC 技术。Java 模式最大的特点就是引入了一个自定义的虚拟机(JVM),所有Java 源程序都会被编译成在这个虚拟机上才能执行的“目标代码”字节码(Bytecode)。在实时运行时,可以有两种运行方式,一种是编译所获得的字节码由JVM 在实际计算机系统上执行;另外一种方式是通过Java实时编译器(Just-In-TimeCompiler)将字节码首先转换成本地机可以直接执行的目标代码,而后交给实际的计算机系统运行,这实际上是两次编译过程,一次是非实时的,一次是实时的。第一次非实时编译时,Java编译器生成的是基于JVM的“目标代码”,所以它其实也就是一次交叉编译过程。 GCC模式与Java模式不同,它通过Cross GCC直接生成目标平台的目标代码,从而能够直接在目标平台上运行。其关键在于对Cross GCC 选择,我们需要选择针对具体目标平的Cross Gcc。相对来说,GCC模式代码比Java模式更为优化,效率更高。目前Linux操作系统也主要是以GCC模式进行移植的。 GCC 在进行代码编译时,为了保证编译过程与具体计算机硬件平台的无关性,它使用RTL(Register Transfer Language)寄存器传递语言对目标平台的指令进行描述。GCC编译过程也是比较复杂的,其基本流程如图4-3所示: 从GCC输出的是汇编语言源程序,如果我们想要进一步编译成我们想要的机器代码,则还需要汇编器等的协助,这就是我们前面提到的工具链。工具链中通常包含GNU Binutils,GNU GCC,GNU GLibc。Binutils中主要包含链接器ld 和汇编器as。而GNU GCC 我们以上已做了不少介绍了。至于GNU GLibc,它提供了一个C 库,使得系统能完成基本的系统调用及其它的一些函数调用。生成GCC交叉编译器的过程一般包含如下几个步骤: 1)取得Binutils、GCC、Glibc的源码。你可以到相关网站去获得,网上这方面资源比较丰富。你把这三个文件解压到你自己的目录如:/toolchain/gcc, /toolchain/bu, /toolchain/glibc, 2)配置并编译Binutils,得到我们下一步要用到的汇编器和连接器。 在配置Binutils之前先把Linux内核中GCC所必需的头文件拷到GCC可以找到的目录。如下操作: cp dr include/asm-arm /toolchain/gcc/arm-linux/include/asm cp dr include/linux /toolchain/gcc/arm-linux/include/linux cd /toolchain/bu./configure -target=arm-linux -prefix=/toolchain/arm make make install 3)配置并编译GCC源代码,生成GCC编译器。 编译之前先修改gcc 的t-linux 文件,此文件放在gcc/config/arm 目录下。在t-linux 文件中的TARGET_LIBGCC2_CFLAGS 后加上_gthr_posix_h inhibit_libc,操作如下: 进入gcc/config/arm目录 cd /toolchain/gcc/config/armcp t-linux t-linux-orig /备份原来的t-linux文件 vi t-linuxseds/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D_gthr_posix_h -Dinhibit_libc/ t-linux-core cp ./t-linux-core ./t-linux cd /toolchain/gcc./configure -target=arm-linux -prefix=/toolchain/gcc -enable-languages=c -with-local-prefix=/toolchain/gcc/arm-linux -without-headers -with-newlib -disable-sharedmakemake install/这里首先生成的是C编译器。 4)配置Glibc编译生成Glibc的C函数库。 编译Glibc之前我们先要把编译器改为我们刚刚生成的交叉编译器arm-linux-gcc,同时要指定编译所需要的头文件。操作如下 export CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib 然后进入Glibc的安装cd /toolchain/glibc./configure -host=arm-linux -prefix=/toolchain/gcc/arm-linux -enable-add-ons -with-headers=/toolchain/gcc /arm-linux/includemake make install5)再次配置并编译GCC源代码,生成其它语言的编译器。如:C等。恢复t-linux 文件 用备份的t-linux-orig 覆盖改动后的t-linux cp /toolchian/gcc/config/arm/t-linux-orig /toolchian/gcc/config/arm/t-linux cd /toolchain/gcc./configure -target=arm-linux -prefix=/toolchian/gcc -enable-languages=c,c+ -with-local-prefix=/toolchian/gcc /arm-linuxmake make install4.2.3修改Linux内核源码 在完成交叉编译环境的建立之后,进入下一阶段,对linux内核的移植修改。linux的移植是个繁重的工作,其主要包含启动代码的修改,内核的链接及装入,参数传递,内核引导几个部分。linux内核分为体系结构相关部分和体系结构无关部分。在Linux启动的第一阶段,内核与体系结构相关部分(arch目录下)首先执行,它会完成硬件寄存器设置,内存映像等初始化工作。然后把控制权转给内核中与系统结构无关部分。而我们在移植工作中要改动的代码主要集中在与体系结构相关部分。 在arch目录中我们可以看到有许多子目录,它们往往是用芯片命名的,表示是针对该芯片体系结构的代码。为arm 系列芯片编译内核,就应修改ARM目录下的相关文件。在ARM的子目录下我们可以找到一个boot/bootp目录,在bootp下有一个init.S的文件,.S表示它是汇编语言文件。这里init.S是用ARM汇编写成的。这个init.S就是引导Linux内核在Arm平台上启动的初始化代码。它里头定义了一个全局符号_start,它定义了默认的起始地址。同时它也是整体内核二进制镜像的起始标志。Init.S主要完成以下功能: 1) 定义数据段、代码段、bbs(未初始化数据段)起始地址变量并对bbs段进行初始化。 2) 设置寄存器以初始化系统硬件。 3) 关闭中断。 4) 初始化LCD显示。 5) 将数据段数据复制到内存。 6) 跳转到内核起始函数start_kernel 继续执行。 7) 对主寄存器的修改。 而至于初始化设置的寄存器则要根据你的平台,参考相应的芯片手册。一般要做修改的寄存器有:片选组基地址寄存器,DRAM存储配置寄存器,DRAM片选寄存器,中断屏蔽寄存器等。此后代码会进入到entry.S继续执行,它会继续完成对中断向量表配置等一系列动作。 第一阶段的启动过程除了以上所说的之外,还要进行内核的链接与装入等工作。内核可执行文件是由许多链接在一起的目标文件组成的。我们以ELF(可链接可编译文件,是目前大多数Linux系统都能认的一种文件格式)为例。ELF文件有text(文本段),data(数据段),bbs等组成。这些段又由链接脚本(Linker description)负责链接装入。链接脚本又有输入文件和输出文件。输出文件中输出段告诉链接器如何分配存储器。而输入文件的输入段则描述如何把输入文件与存储器映射。4.2.4Linux内核裁减 Linux 内核的裁剪与编译看上去是个挺简单的过程.只是对配置菜单的简单选择.但是内核配置菜单本身结构庞大,内容复杂.具体如何选择却难住了不少人.因此熟悉与了解该菜单的各项具体含义就显得比较重要.我们现在就对其作一些必要介绍: Linux内核的编译菜单有好几个版本,你运行: 1)make config:进入命令行,可以一行一行的配置,这不好使用所以我们不具体介绍. 2)make menuconfig:进入我们熟悉的menuconfig菜单,相信很多人对此都不陌生. 3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。 所有内核配置菜单都是通过Config.in 经由不同脚本解释器产生.config。make menuconfig/ 配置make dep/ make zImage/ 编译成功后在arch/arm/boot目录下生成zImage内核映像文件minicom/ 登陆到开发板tftp zImage kernel/ 下载到开发板上flash kernel/ 烧写到flash上内核编译配置选项说明:1、Code maturity level options代码成熟度选项,它又有子项: 1.1、prompt for development and/or incomplete code/drivers 该选项是对那些还在测试阶段的代码,驱动模块等的支持.一般应该选这个选项,除非你只是想使用LINUX中已经完全稳定的东西.但这样有时对系统性能影响挺大. for obsolete code/drivers该项用于对那些已经老旧的,被现有文件替代了的驱动,代码的支持,可以不选,除非你的机器配置比较旧.但那也会有不少问题.所以该项以基本不用,在新的版本中已被替换. 2、loadable module support动态加载模块支持选项,其子项有: 2.1、 enable module support支持模块加载功能,应该选上. 2.2 set version information on all module symbols 该项用来支持跨内核版本的模块支持.即为某个版本的内核编译的模块可以在另一个版本的内核下使用,我们一般用不上。所以不选. 2.3 kernel module loader如果你启用这个选项,你可以通过kerneld程序的帮助在需要的时候自动载入或卸载那些可载入式的模块。我们一般会选上. 3、 system type系统类型,主要是CPU 类型,以及于此相关的内容.该项下的子项比较多。 如果进行交叉编译,该项下的内容往往是经过相应目标平台开发人员修改的.主要是针对该平台的体系结构定义,在我们开发板上使用的是PXA270 ARM 系列CPU.其它选项是关于该芯片及平台的一些结构定义.其它版本内核遇到的不会是这种情况,但一般包含processor family 选项,它让我们选择CPU的类型,BIOS可以自检到,留意一下你的系统的启动信息。选上正确的CPU类型就行. 4、General setup4.1、support hot-plugable devieces对可热拔插的设备的支持,看情况选择.若要对U盘等USB设备进行控制,建议选上. 下面分别是 support网络支持,用到网络设备当然要选上. V IPC:支持systemV 的进程间通讯,选上吧. 4.2、sysctl support: 该项支持在不重启情况下直接改变内核的参数.启用该选项后内核大约会增大8K,如果你的内存太小就别选。 math emulation 一般要选一个模拟数学协处理器,选上吧. manager电源管理,给X86编译内核时较有用可以选上,尤其是笔记本.给ARM编内核时可不选. 其它的看情况,在我们的平台上目前都用不着,不用选. 5、Networking option网络选项主要是关于一些网络协议的选项.Linux 号称网络操作系统,它最强大的功能也就是在于对网络功能的灵活支持.这部分内容相当多,看情况,一般我们把以下几项选上. 5.1、 packet socket包协议支持,有些应用程序使用Packet协议直接同网络设备通讯,而不通过内核中的其它中介协议。同时它可以让你在TCP不能用时找到一个通讯方法. unix domain socket对基本UNIX socket 的支持 TCP/IP networking对TCP/IP 协议栈的支持,当然要.如果你的内核很在意大小,而且没有什么网络要就,也不跑类似X Window 之类基于Unix Socket 的应用那你可以不选,可节省大约144K 空间. 6、Networking deveices:网络设备支持.上面选好了网络协议了,现在选的是网络设备,其实主要就是网卡,所以关键是确定自己平台所使用的网卡芯片.该项下的子项也不少. 6.1、Dummy net driver support哑(空)网络设备支持.它可让我们模拟出TCPIP环境对SLIP或PPP的传输协议提供支持.选择它Linux核心增大不大。如果没有运行SLIP或PPP协议,就不用选它。 driver support bonding技术是用来把多块网卡虚拟为一块网卡的,使他们有一个共同的IP地址. TUN/TAP device driver support 用于支持TUNx/TAPx设备的 6.3、SLIP(serial line) support 这是MODEM族常用的一种通讯协议,必须通过一台Server(叫ISP)获取一个IP地址,然后利用这个IP地址,可以模拟以太网络,使用有关TCPIP的程序。 6.4、PLIP(parallel port) support依字面上看,它是一种利用打印机的接口(平行接口),然后利用点对点来模拟TCPIP 的环境。它和 SLIPPPP 全都属于点对点通讯,您可以把两台电脑利用打印机的连接接口串联起来,然后,加入此通讯协议。如此一来,这两部电脑就等于一个小小的网络了。不过,如果电脑有提供打印服务的话,这个选项最好不要打开,不然可能会有问题(因为都是用平行接口)。 6.5、PPP(pointtopoint)support点对点协议,近年来,PPP协议已经慢慢的取代SLIP的规定了,原因是PPP协议可以获取相同的IP地址,而SLIP则一直在改变IP地址,在许多的方面,PPP都胜过SLIP协议。 6.6、EQL (serial line load balancing) support 两台机器通过SLIP或PPP协议,使用两个MODEM,两条电话线,进行通讯时,可以用这个Driver以便让MODEM的速度提高两倍。当然。 Ring driver support 对令牌环网的支持. network tap6.9、Ethernet (10 or 100Mbit) 十至百兆以太网设备,我们现在该类型设备用的比较多.进入该项里头还有许多小项,它们是关于具体网络设备(一般就是网卡)的信息.选择我们平台相关的就行. support 7、Amateur Radio support 这个选项用的不多,它是用来启动无线网络的,通过无线网络我们可以利用公众频率来进行数据传输,如果你有相关无线网络通讯设备就可以用它. 8、IrDA(infrared) support 该项也属于无线通讯的一种,用于启动对红外通讯的支持.目前在2.6.X的内核里对它的支持内容更丰富了. 9、ATA/ATAPI/MFM/RLL support 该项主要对ATA/ATAPI/MFM/RLL 等协议的支持.在嵌入式设备中,目前这些设备应用的还不多,但台式机及笔记本用户如果你有支持以上协议的硬盘或光驱就可选上它.在2.6.X 内核中这方面的支持内容也比较丰富. 10、SCSI device support 如果你有SCSI设备(SCSI控制卡,硬盘或光驱等)你选上这项.目前SCSI设备类型已经比较多,要具体区分它们你得先了解他们所使用的控制芯片类型.2.6.X内核中对各类型SCSI设备已经有更具体详细的支持. 11、ISDN support ISDN (Integrated Services Digital Networks)它是一种高速的数字电话服务.通过专用ISDN线路加上装在你电脑上的ISDN卡.利用SLIP或PPP协议进行通讯.所以你若想启动该项支持ISDN通讯,你还应启动前面提到的Networking Devices中的SLIP或PPP.12、Console drivers support 控制台设备支持.目前安装uClinux/Linux 的设备几乎都是带控制台的,所以这项是必选项.这里头还有几个子项: text console 一般台式机选该项.支持VGA显示设备. Frame Buffer devices 该项支持Frame Buffer 设备.Frame Buffer 技术在2.4.X 内核被全面采用.它通过开辟一块内存空间模拟显示设备.这样我们可以像操作具体图形设备一样来操作这块内存,直接给它输入数据,在具体显示设备上输出图形.在嵌入式设备上广泛采用LCD 作为显示设备,所以该项显得比较重要.当该项被选上后会出现一子项让我们根据自己平台配备的具体硬件选择相应支持.这些也往往是设备开发人员给添加的. 13、parallel port support对并行口的设备的支持.LINUX可以支持PLIP协议(利用并行口的网络通讯协定),并口的打印机,ZIP磁盘驱动器、扫描仪等。如果有打印机在选择利用并口通讯时要小心,因为它们可能会互相干扰. 14、Memory Technology Device (MTD) support MTD包含flash,RAM等存储设备.MTD在现在的嵌入式设备中应用的相当多,也特别重要.选中该项我们可以对MTD进行动态支持.其下还有好多具体小项.14.1、MTD partitioning support选上该项可支持对MTD 的分区操作.我们在对嵌入式设备的操作系统移植过程中往往要对MTD进行分区,然后在各分区放置不同的数据.以让系统能被正确引导启动. 14.2、Direct char device access to MTD devices 选该项为系统的所有MTD设备提供一个字符设备,通过该字符设备我们能直接对MTD设备进行读写以及利用ioctl()函数来获取该MTD设备的相关信息. 14.3、Caching block device access to MTD devices 有许多flash芯片其擦除的块太大因此作为块设备使用效率被大打折扣.我们选上该项后,它支持利用RAM 芯片作为缓存来使用MTD 设备.这时对于MTD 设备块设备就相当于它的一个用户.通过JFFS文件系统的控制,它可以模拟成一个小型块设备,具有读,写,擦,校验等一系列功能. 14.4、NAND flash device drivers 子项中有几项是关于MTD 设备驱动的,我们的平台选择的是NAND flash 所以我们选上它.选上后在其二级子项中我们还要选上: devices support NAND pages writes 支持页校验 flash device on ARM board15、Plug and Play support 这是对PNP(即插即用)设备的支持. 16、block devices 块设备,该项下也有好几个子项,主要是关于各种块设备的支持.至少把RAM的支持项选上.如在我们UP-TECHPXA270平台上我们要选上: 1)RAM disk support 2)Initial RAM disk(initrd) support 17

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论