版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
太原科技大学硕士学位论文嵌入式数据库的设计与实现姓名:解辉申请学位级别:硕士专业:计算机应用技术指导教师:徐玉斌;李建伟20080701嵌入式数据库的设计与实现中文摘要嵌入式数据库是近些年才兴起的一项新的数据库技术,它以目前成熟的数据库技术为基础,针对嵌入式设备的具体特点,实现对移动设备和嵌入式设备上数据的存储、组织和管理。传统的数据库系统一般都是运行在大型的计算机设备上,包括主机系统和各种各样的服务器,随着计算设备的日益小型化,数据库的小型化也日益迫切。与大型计算机设备相比,这些小型的计算设备内存较小,硬盘也较少,因此简单地将原来的大型数据库移植到小型设备上效果并不好,必须依据这些设备的特点专门设计相应的数据库系统。针对嵌入式系统的需求,文章主要在两个方面进行了研究。首先,本文在综合分析当前嵌入式数据库系统的主要功能和发展现状的基础上,以实用、体积小、便于嵌入式应用为主要追求目标,针对嵌入式设备的具体特点,完成了词法分析器、语法分析器以及索引机制优化等方面的研究与设计,并在Linux下用C语言设计了一款能有效存储、操作和管理实时数据信息的嵌入式数据库,用以实现对嵌入式设备数据的统一管理。此数据库具有微小内核、系统尺寸可剪裁、良好的跨平台性以及灵活的应用编程接口等特点,支持ACID事务,支持SQL92标准子集,无须独立运行的数据库引擎,由程序直接调用相应的API函数就可以实现对数据的存取操作。通过与SQLITE的测试比较可以看出,本文设计的数据库在操作涉及的数据量较小的情况下,插入、查找和删除性能均有较大提高,比较适合于应用到数据操作较少的嵌入式设备。其次,基于ARM硬件平台,采用Linux操作系统,在已开发完成的嵌入式数据库进行数据管理的基础上,设计了一个嵌入式实时数据采集系统。此系统很好的解决传统数据采集系统存在的数据管理混乱、存储效率低下等不足,在复杂环境下能够对多种数据信息进行实时采集、高效存储管理和快速传输。关键词:嵌入式系统;嵌入式数据库;ARM;LINUXTheResearchandDesignofEmbeddedDatabaseGraduateName:XieHuiMajor:ComputerAppliedTechnologyLiJian-weiDirectedby:XuYu—binABSTRACTEmbeddedDatabaseisrecentyears.Basedonanewtechnologyofdatamanagementrisinginmaturedatabasetechnologyandspecialembeddedondevice,itimplementsthedata’Sstorage,organizationandmanagementmobiledevicesandembeddeddevices.Traditionally,databasesystemsrunonlarge—scalecomputerequipmentthecomputerincludinghostcomputersystemsandallkindsofservers.Asequipmentgosmallerandsmaller,thedatabase’SminiaturizationiSurgently.Comparedwithlarge.scalecomputers,thesesmall—scalecomputationalunitsarecharacterizedbysmackasmemo巧andminorhardwareeventheyhavenohardwaresuchhand.helddevicesandintelligenthouseholdelectronics.So,itiSnotfeasibletoiusttransplantlarge.scaledatabasetosmall-scaledevices.databaseWemustcharacters.speciallydesignedsystemstofitforthedevices’Consideringthedemandoftheembeddedsystems,thepaperwillshowfunctionandthetheprojectinstatetwoparts.Firstly,throughofanalyzingthemainsystemactualcurrentembeddeddatabasesynthetically,theembeddeddatabase,thegoalofwhichisavailability,smallsizeandconvenienceforembeddedapplicationsis,designedreferstoaccidenceanalyzer,syntaxanalyzerandtheoptimizationofindexmechanismandSOon.Aimingattheconcretefeaturesofembeddeddevices,theembeddeddatabasesystemdesignedinLinux,whichcouldstore,operateinformationapplianceseffectively.ItsupportsandmanagethedataoftheACIDaffair,SQL92IIIstandardsubset,integratedwithitsconcreteapplicationandtheembeddedLinuxanddoesn’tneedunattachedrunningengine,theprogramcallsitsrelevantAPIfunctiontorealizetheaccessoperation.ThroughcomparingwiththeSQLITE,thedatabase’sperformancehasimprovedgreatlvwhileinvolvingrelativelysmallamountofdata,whichisfitf.ortheembeddeddeviceswhichtreatlessdata.Secondly,thearticlebasedonARMandLinuxoperationsystem,usingtheembeddeddatabasedesignedinthefirstparttomanagethereal_datasystemcantodesignareal—timedataacquisitionsystem.Theasconquerthedefectintraditionaldataacquisitionsystem.suchdatamanagementchaosand10Wstorageefficiency,andhaveagoodinperformanceofefficientstorageandrapidcomplexenvironment.transmissionwhilebeingKeywords:EmbeddedSystem;EmbeddedDatabase;ARM;LinuxIV承水诺话书吊本人郑重声明:所呈交的学位论文,是在导师指导下独立完成的,学位论文的知识产权属于太原科技大学。如果今后以其他单位名义发表与在读期间学位论文相关的内容,将承担法律责任。除文中已经注明引用的文献资料外,本学位论文不包括任何其他个人或集体已经发表或撰写过的成果。学位论文作者(签章):200年月日第一章绪论第一章绪论1.1研究背景及意义随着计算环境的发展,数据库系统也从集中式、分布式发展到今天的嵌入式数据库系统。与通用的桌面系统不同,由于嵌入式系统没有充足的内存和磁盘资源,因此,不论是嵌入式的操作系统还是数据库管理系统,都要占用最小的内存和磁盘空间。若采用大型的商用数据库管理系统,则不可避免的占用大量的内存和磁盘空间,同时会产生大量的冗余数据,因此,它不能应用于嵌入式系统的数据管理。长期以来,商业数据库行业都在不停的追逐高性能的事务处理以及复杂的查询处理能力,并制定了相应的行业标准。但是对嵌入式数据库系统来说,嵌入式应用系统之间差别很大,因此它们对嵌入式数据库系统的要求较高,这主要表现在:易于维护、高度可靠性和小巧性。嵌入式系统内存较小,CPU速度慢,因此,在嵌入式数据库系统中数据的结构和算法以及数据查询处理算法非常关键,必须采用合适的策略和特殊的数据结构、算法才能满足用户的需求…。1.2国内外研究现状嵌入式数据库(EDB)在移动计算平台、家庭信息环境、通讯计算平台、电子商务平台等领域得到广泛的应用。正是基于这一事实,各国研究机构纷纷展开了对嵌入式数据库的研究,各大数据库厂商也将开发相应主打数据库系统的嵌入式数据库系统作为一个重要的发展方向。在国外,IBM公司在DB2通用数据库中推出了IBMDB2Satellite和Everyplace版本,它所提供的移动计算功能使移动办公用户获得了与企业数据保持同步的能力。同时Informix公司也由旗下的Cloudscape公司推出了其移动解决方案旗舰产品的最新版本Cloudscape3.0,可以对包括从服务器到笔记本电脑,甚至到轻型信息设备,进行数据管理。而作为移动计算的市场领先者Sybase公司多年前就敏锐地预见到计算设备小型化的发展趋势,投入了大量的人员和资金对小型数据库进行研究与开发工作,并且在全球最早推出了移动与嵌入数据库产品包-SybaseStudi0.SOLAnywhere在国内,面对着嵌入式数据管理领域新的市场需求,东北大学软件中心凭借着多年积累的数据库系统和嵌入式系统的开发经验,在大型数据库管理系统OpenBASE的基础上,研制开发了嵌入式数据库管理系统OpenBASEMini。北京人大金仓信息技术嵌入式数据库的设计与实现有限公司也凭借其强大的研发实力,推出了具有自主知识版权的小金灵嵌入式移动关系数据库系统KingbaseLife硷1。以上这些嵌入式数据库系统在功能和性能上具有一定的共性,比如说一般对资源要求较低,占用内存空间较小,从几十K到几百K不等,支持C编程接口和标准SQL子集的开发接口,支持ODBC或JDBC,能与支持其标准的任意数据库交换数据,支持双向数据交换能力,实现了中央数据库与嵌入式数据库间的数据双向流动等。但这些数据库系统也有各自不同的特点,鉴于嵌入式领域的特点,对嵌入式数据库产品还很难形成统一的标准,对嵌入式数据库管理系统的研究,也还有很多工作要做。1.3本文的研究目标和研究内容目标是在研究现有嵌入式数据库的基础上设计和实现一个具有如下特征的嵌入式数据库:1)零配置,程序驱动。2)实现部分的SQL92标准。3)数据库完整存储在磁盘文件中。4)提供简单明了的API。本文的研究内容主要包括以下几方面:1.第一章主要介绍了嵌入式数据库系统研究的意义、国内外的研究现状以及本文研究的主要内容。2.第二章主要介绍了嵌入式系统,嵌入式操作系统和嵌入式数据库的特点和体系结构。3.第三章对嵌入式数据库进行概要设计和详细设计并初步实现一个可运行的嵌入式数据库。4.第四章基于第三章开发完成的EDB的基础上,设计并实现嵌入式数据采集系统。5.第五章对第三章开发的EDB和第四章开发的数据采集系统进行测试。6.第六章进行总结与展望。2第二二章嵌入式系统与嵌入式数据库第二章嵌入式系统与嵌入式数据库2.1嵌入式系统2.1.1嵌入式系统的定义嵌入式系统(EmbeddedSystem)是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统∞3。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。2.1.2嵌入式系统的特点嵌入式系统的核心是嵌入式微处理器,嵌入式微处理器一般具备以下4个特点H3:(1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核的执行时间减少到最低限度。(2)具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。(3)可扩展的处理器结构,以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。(4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此。2.1.3嵌入式系统的应用嵌入式系统的应用前景是非常广泛的,人们将会无时无处不接触到嵌入式产品,从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等等。当嵌入式的无线电芯片的价格可被接受时,它的应用可能会无所不在。在家中、办公室、公共场所,人们可能会使用数十片甚至更多这样的嵌入式无线电芯片,将一些电子信息设备甚至电气设备构成无线网络,在车上、旅途中,人们利用这样的嵌入式无线电芯片可以实现远程办公、远程遥控,真正实现把网络随身携带瞄3。2.2嵌入式操作系统2.2.1嵌入式操作系统的定义嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统3嵌入式数据库的设计与实现(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等browser[6]。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。2.2.2嵌入式操作系统的特点嵌入式操作系统具有以下一些特点哺1:(1)体积小。嵌入式系统有别于一般的计算机处理系统,它不具备像硬盘那样大容量的存储介质,而大多使用闪存(FlashMemory)作为存储介质。这就要求嵌入式操作系统只能运行在有限的内存中,不能使用虚拟内存,中断的使用也受到限制。因此,嵌入式操作系统必须结构紧凑,体积微小。(2)实时性。大多数嵌入式系统都是实时系统,而且多是强实时多任务系统,要求相应的嵌入式操作系统也必须是实时操作系统(RTOS)。实时操作系统作为操作系统的一个重要分支已成为研究的一个热点,主要探讨实时多任务调度算法和可调度性、死锁解除等问题。(3)特殊的开发调试环境。提供完整的集成开发环境是每一个嵌入式系统开发人员所期待的。一个完整的嵌入式系统的集成开发环境一般需要提供的工具是编译/连接器、内核调试/跟踪器和集成图形界面开发平台。其中的集成图形界面开发平台包括编辑器、调试器、软件仿真器和监视器等。2.3嵌入式数据库2.3.1嵌入式数据库定义嵌入式数据库是指运行在本机上、不用启动服务端的轻型数据库,它与应用程序紧密集成,被应用程序所启动,并伴随应用程序的退出而终止。2.3.2嵌入式数据库的特点嵌入式数据库系统有如下主要特点n’:(1)占用存储空间小(2)可靠性、可管理性和安全性(3)互操作性和可移植性。2.3.3嵌入式数据库的关键技术为了使嵌入式系统能更好地发挥其作用,主要涉及以下几种关键技术发展方向:(1)系统的高可靠性技术(2)系统整体的微型化(3)数据同步/复制技术(4)系统可定制能力(5)系统可移植性与多平台支持(6)网络支持与数据。4第三章嵌入式数据库的分析与设计第三章嵌入式数据库的分析与设计本章将讨论如何分析和设计一个嵌入式数据库系统,包括数据库的功能需求、性能需求、运行环境、开发环境、系统架构以及各模块和模块间的关系等。3.1嵌入式数据库的体系结构嵌入式EDB是指可在嵌入式设备中独立运行的一种数据库系统,用以处理大量的、时效性强且有严格时序的数据,它以高可靠性、高实时性和高信息吞吐量为目标,其数据的正确性不仅依赖于逻辑结果,而且依赖于逻辑结果产生的时间随1,嵌入式系统基本结构如图3-1所示。图3-1嵌入式系统基本结构目前嵌入式系统开发中,在嵌入式数据库问题上的多数看法是,嵌入式数据库从本质上说是一个“内存数据库”,是一个由应用程序管理的内存缓冲池,它在系统中的作用就是一个供多个实时任务共同使用的共享数据区。这种数据库实际上是一个嵌入在用户应用软件中的与应用程序不可分割的部分,其功能主要是数据的存和取,不具有独立性,不是一个真正意义上的数据库系统睁1。一个完整的嵌入式实时数据库系统除了包括内存数据库外,还应当含有历史数据库和数据库管理系统DBMS及提供给用户的接口函数,整个数据库可由DBMS完成对数据库的具体配置及各种操作,例如系统运行前根据实际需要对内存数据库中的记录节点进行增减等配置操作,嵌入式数据库库的模块结构如图3-2所示。5嵌入式数据库的设计与实现图3—2嵌入式EDB的模块结构嵌入式数据库的关键是数据模型的确立,它决定了数据被访问和操作的方式,应63.2嵌入式数据库的数据模型用程序的性能和可靠性也大部分取决于此。目前嵌入式环境下的数据库系统多数采用了关系模型结构,这也是商用数据库系统的数据模型,该模型结构是利用二维表来实现数据存储,利用索引访问和查询数据,这种模型结构是建立在严格的数学基础上的,结构简单灵活,独立性好,但在嵌入式环境下的内存开销和数据冗余较大,用户必须对其进行优化,增加了开发数据库系统的难度;有些嵌入式数据库则采用了网状模型结构,该模型通过指针来确定数据间的显式连接关系,它比关系模型中利用冗余数据和索引文件要节约大量的存储空间,具有一定的数据独立性和共享特性,运行效率较高,而且由于它避免了索引操作,比关系型数据库模式要节省存储空间,数据操作速度也更快n01。但是这种模型结构比较复杂,尤其当嵌入式系统规模增大时,其数据库的结构变得非常庞大,可能会影响到系统的实时性能。图3—3所示的是在相同数目的记录下,关系模型和网状模型的系统开销比较,从图中可以得知,网状模型因为避免了索引操作使得其开销要小于关系模型nu。7嵌入式数据库的设计与实现3.4嵌入式数据库的运行过程和开发过程3.4.1运行过程EDB的运行过程是一个在数据库引擎总控模块的控制下进行的有序协调的过程。EDB的运行过程分为5个步骤n别。(1)数据库系统初始化EDB的初始化调用API的初始化函数启动,初始化数据库系统的全局控制结构,取数据库的运行状态信息,分配数据库内存空间,EDB系统初始化时还将对数据字典表进行确认n朝。(2)打开或创建字典表在数据库系统第一次启动时,即数据库第一次被装入时,该字典表是不存在的,在这里初始化时将创建字典表,为后续操作做好准备。在数据库系统以后的启动过程中,如果该字典己经存在,数据库系统初始化时将确认字典表是否已存在,此时如果检查到字典表不存在,将重新打开一个字典表。(3)数据库具体操作EDB系统及其具体的字典表操作初始化后就可以在数据库操作引擎控制下调用数据存取模块或数据库维护模块对数据库进行各种操作了。对基本表的主要操作有:创建基本表、插入记录、删除记录、修改记录、查找、排序、备份和恢复以及碎片整理等,我们将在第四章对重要功能的操作流程和实现进行详细介绍。(4)关闭字典表关闭字典表后可以释放已经分配的输出缓冲区空间、结果集结构空间、控制头结构、列定义信息等内部结构变量空间,并可以释放该字典表占用的类信息结构。……(5)关闭数据库系统通过调用API的关闭函数实现。主要工作是关闭数据库,释放EBD系统申请的全局结构变量空间即DB结构,释放并分配给EDB的空间。实际运行过程中,数据库系统初始化后,若字典表创建成功或己存在的条件下,可对字典表进行多次的打开操作和关闭操作n41。3.4.2开发过程EDB的开发过程是按照软件工程的思想来组织实施的。开发过程依次经历了原型阶段,需求分析阶段,概要设计阶段,详细设计阶段,编码阶段,测试阶段,以及维护阶段。8第三章嵌入式数据库的分析与设计在原型阶段,主要是在台式机上围绕着EDB的一些基本功能,如表创建,记录的插入、删除、修改等操作,在PC机上予以实现,以获得对将要开发的系统的一个初步的认识。实际开发的原型是在Linux环境下实现的。在需求分析阶段,主要是根据用户的要求,进一步细化系统应该具有的功能和性能要求,和用户达成一致,并为下一步的系统概要设计打好基础。在概要设计阶段,基本上确定了系统的体系结构,确定了系统向用户所提供的API接口,确定了系统各个组成模块之间的关系,确定了系统的一些核心数据结构。在详细设计阶段,主要是设计各个模块具体函数的伪代码或流程图实现。在编码阶段,主要工作就是编码并调试,以实现系统预定的功能n朝。在测试阶段,测试工作非常重要,除了在系统开发的各个阶段都贯穿了一些测试的内容外,还专门安排了一个比较长时间的测试阶段。测试阶段包含了功能测试,健壮性测试,性能测试等多个测试环节,经过测试阶段,系统的质量和稳定性都得到了比较大的提高。3.5概要设计3.5.1功能需求嵌入式数据库系统作为DBblS,它应当具备以下功能:(1)数据定义和数据存储这部分内容包括元组的表示,属性的表示,索引的表示,元组和属性的关系,各种数据类型的表示和存储,如整型(长整型、短整型)、字符型、实型、日期类型、时间类型等。数据文件表的格式和组织,索引文件表的格式和组织,元数据的组织和存储等等n钔。(2)数据存取能实现对数据库的基本操作,如建立表,建立索引,删除表,删除索引,对元组的检索和更新操作(插入、删除、修改),其它的操作还包括排序、压缩、整理等功能。必须支持SOLDDL和DML一个较完备的子集。(3)访问接口嵌入式数据库系统需要提供共应用程序开发人员使用的访问接口,而且应当是符合SOL标准的访问接口。(4)缓冲区管理为提高系统性能,减少磁盘I/o操作,对数据表文件的读写必须提供缓冲机制,9嵌入式数据库的设计与实现操作系统的文件系统提供的文件缓冲是远为不够的,嵌入式数据库系统自身应该有出色的缓冲区管理功能n引。(5)内存管理占用最少的内存资源和内存资源可控制是嵌入式数据库的首要目标。合适的内存管理策略,不仅有助于达到这个目标,而且有助于保护系统的堆空间,增强系统的可靠性。(6)数据库管理工具嵌入式数据库还需要一组实用工具,供用户在线或离线管理数据库,这样的工具包括数据库元数据的报表打印、数据库一致性的检查、数据库表的数据导入导出工具、碎片整理和压缩等。3.5.2性能需求衡量嵌入式数据库的性能要求有两个方面,一是作为DBMS系统,其性能如何,数据库中最多数据表的个数,数据表的最大文件长度,每个表的最大元组个数,每元组的最多属性个数,每个表上建立的最多索引数等等,二是作为嵌入式系统软件,其性能如何,包括内存资源占用,CPU开销等。前文我们说过,嵌入式数据库和应用密切相关,所以有些性能指标比如响应时间或事务处理平均时间就难以确定,我们只能给出合理的参考值要求(针对特定的硬件平台)。当然,大多数的指标还是可以确定的。其它性能要求还包括对可靠性的要求,嵌入式数据库系统要保证在无人管理的情况下长时间的无故障运行n61。而且,在系统发生故障不能恢复的时候,也不可干扰或破坏设备中其它部件的正常工作。嵌入式数据库系统还应当具备良好的可伸缩性,根据不同的应用能够为系统进行定制,比如定制所需的子模块,定制缓冲区的大小等。嵌入式数据库系统还应满足较好的可移植性,能够提供开放的接口和其它系统互操作。3.5.3运行环境和开发环境EDB目前支持的平台是各种嵌入式Linux,具体产品包括各种高端的消费类电子设备,需要为EDB搭建嵌入式开发交叉平台,这个平台需要的部件包括:主机(Host):它是开发人员的工作机,一般是桌面系统,分析、设计和文档撰写以及代码编写、大部分的调试工作等都在主机上完成n71。目前的主机是RedHatLinux7.3,目标机(Target):它是EDB实际运行的平台,该平台必须运行嵌入式Linux操作系统。当EDB系统基本成型后就需要从主机下载到目标机进行进一步的调试,本系统的目标机是基于ARM9平台的嵌入式Linux系统。10第三章嵌入式数据库的分析与设计3.6详细设计嵌入式数据库设计流程如图3-4所示,主要包括SQL解析、词法分析、语法分析、SQLAPI设计、事物的调度和执行策略、脱机移动事物、日志回滚和故障恢复几个方面。由于嵌入式数据库系统中的功能较多,中的重要功能设计和实现进行介绍。限于篇幅,仅对嵌入式数据库系统DDL模式文件DML语法DDL语法解析模块解析模块数据定义模块晶僻荔_广I簇菇“。兰塑至竖堡苎ll;苗芝缓冲区内部数据结构图3—4EDB的体系结构SQLAPI数据访问模块3.6.1SOL解析SQL语句中具有独立意义的单词,称之为单位体,有时也称为原予。词法分析的主要目的就是分隔单位体,并将这些单位体按照先后顺序插入单位体链表。每种单位体的规则和意义各不相同,比如单引号,在单引号内的其他符号都失效,而两个连续的单引号才表示一个单引号字符。从功能上分析,单位体可以分成7类:括号、子查询、数值运算、比较运算、逻辑运算、变量以及其他控制符号。若从可见性分析,单位体可以分成两类,即可见单位体和非可见单位体。非可见单位体主要是一些抽象的单位体,比如逻辑单位体。任意一条合法Where子句,最后经过运算必须得到一个唯一的抽象的非可见单位体,即逻辑单位体n8|。若为1,记录符合要求,需要写入结果集:反之,则不符合要求,需要跳过。则表示当前解析SQL语句总体目标是将SQL语句转换成系统可以理解的格式,这就是语法分析的工作。这里所谓系统可以理解的格式,是指按照SQL92标准,判别该SQL语句的类型(查询、删除、修改记录等),并根据不同的类型作不同的语法分析。比如查询语句,总体而言可以分成三个部分。select与from之间的部分主要描述结果集嵌入式数据库的设计与实现输出格式,而from与where(若无where子句,则到SQL语句结尾)之间的部分描述本SQL语句所涉及的表,where子句则是表示查询的条件。语法分析的任务之一就是将这三个部分分开并留给以后的系统使用,这也是语法分析的结果之一。在语法分析的过程中,系统需要检查当前SQL语句的合法性,若不合法则报错退出,并给出出错信息。每当语法分析程序解析出一条语句时,就向语句执行列表中插入一个节点,这TABLE个节点的内容包括了该条语句的类型及相应的参数信息。如识别出是CREAT语句,就将插入节点的type域设置为SQL—CREATE—TABLE(为每一种语句都定义了一个标记以标识),并将CREATTABLE的相关参数信息转换为相应的数据结构放入节点的stmt域中。这样当整个脚本文件解析完毕后,所有的语句就会按顺序组成一个语句执行列表。执行时,遍历这个语句执行列表。通过判断每个节点的类型,就能知道所要执行的具体函数。如判断到该节点的type为SQL—CREATE~TABLE,相应的建表函数为EDB_Create()。3.6.2语法解析语法解析是数据库实现要面对的重要问题,此数据库中采用的语法是SQL语法,符合采用BNF范式。显然,语法解析属于编译的范畴,虽然有关课程中已经详细介绍了词法分析和语法分析的理论,但是离开具体的实现还是有相当的距离,特别是对于SQL这样复杂庞大的语法,为了构建完善且可靠的词法分析器和语法分析器有一定的难度和工作量。可喜的是,在Unix世界存在着相关的优秀工具,这些工具能够帮助我们实现一个专业的词法和语法分析器,这便是Flex和Yacc。有了这些自动工具,数据库开发者要做的主要工作便是为SQL语法寻找合适的数据结构,以及为flex和yacc书写正确的脚本。一般的,树型的数据结构对于表示SQL语法是合适的,当然考虑到每个语法的特点,我们可能需要为树做某种程度的变形,而不是标准的树结构。有了合适的数据结构,下一步的工作就是在flex和yacc的脚本中指示它们该如何一步一步的生成SQL解析树。3.6.3存储管理嵌入式数据库的存储管理有两个方面,其一是外部存储管理,即如何组织数据文件、索引文件,二是内部存储管理。由于嵌入式系统内存资源的紧张,如何使用内存资源必然是嵌入式软件的热门话题和重要技术点。对于EDB,内部存储管理涉及到两个关键问题。第一个问题是缓冲区管理,它也和外部存储管理密切相关。缓冲区机制是指为12第三章嵌入式数据库的分析与设计减少Flash或磁盘I/0在EDB和二级存储器之间架设了一块内存空间,其职责是在查询处理过程中让数据存取模块得到所需的元组,数据存取模块通过某种访问方法从这些缓冲区读写元组,写入元组也是写到缓冲区上,而不需要直接访问Flash文件或磁盘系统。这种机制可以大大减少对磁盘的访问,其原因是很多时候我们要访问的元组就己经在缓冲区上了。当EDB初始化时,缓冲区数目将是一个可以设置的参数,不同的应用能够灵活的设置缓冲区的大小。我们为每个关系都设置一定大小的缓冲区(本数据库设为8K),由于页长度固定,这样此关系对应的缓冲区能够装入8个页。当需要访问不在缓冲区中的页时,需要将缓冲区中的某个页写回Flash或磁盘,并调入待访问的页。这样,为尽量减少颠簸,本系统采用LRU算法。第二个问题涉及到动态内存的申请和释放。本数据库是用C/C++实现的,不可避免的牵涉到大量的malloc和free操作,从系统堆中取得或还出内存。嵌入式系统中堆是一种需要特别慎重对待的重要系统资源。系统的malloc允许用户指定任意大小的区块,在系统堆频繁的分配和释放动态内存,特别是长度各异的内存,容易造成堆支离破碎,甚至可能使系统崩溃。系统堆越杂乱,区块大小越是参差不等,找出一个适当的空闲区块的时间更长,效率更低,所谓的通用性必然牺牲效率。另外,EDB的动态内存占用需要处于可控制的范围。鉴于这些考虑,本数据库使用了动态内存管理办法取代了系统的malloc和free,它就是所谓的预分配+内存池技术。其主要思想如下:在EDB初始化时,根据应用规模我们为EDB预先分配一定数量的内存,以后EDB所有的动态内存申请都只从这块内存中取得,这样做一个明显的好处是基本上不会干扰系统堆。这块内存除非EDB系统退出,否则这块内存将一直为EDB所占。然后,我们在这块内存上使用内存池技术,即将它分成若干个块(chunk)‘每个块由一定数量的等长的内存片断(fragment)组成,比如某个块,它由20个片断组成,每个片断都是8字节长,我们称该块为“8字节一块’’。通过分析EDB内部各个动态数据结构的长度,以及数据库表的属性字段长度和元组长度等因素,我们将内存池分成如下20种块:”8字节一块”,’’16字节一块",”24一字节块”,依8字节为步进(step)一直到“128字节一块”,然后是“256字节一块”,”512字节一块”,"1024字节一块”和“2048字节一块”。超过2048字节的片断在嵌入式数据库应用中很少出现,我们简单的将它交由系统堆处理。需要说明的是,这加块并不是静态的在系统初始时被划分死的,而是在需要它的时候才建立,有些情况下内存池中可能就只活跃着2种块,比如“8字节一块"和“16字节一块”。嵌入式数据库的设计与实现将块中的空闲片断由一个链表连接起来,并由一个指针指向表头,这个链表称为空闲表(freelist)。一共需要20个空闲表。值得注意的是,在实现中无须担心空闲表会消耗掉可观的内存,我们可以直接在空闲片断上建立这种链表。当然,我们需要存储这20个空闲表的表头,空闲表带来的额外内存开销也仅限于此。图3—5给出了空闲表和块的示意图。图3—5空闲表和和空闲块不葸图图3-5中4号链表表头指向一个“64字节一块",该块含有4个片断,某个片断中含有一个0指针表示链表的结束。当EDB中的某个模块提出动态内存申请时,内存池将视其大小从特定块中取出一个合适的空闲片断交付给该模块,同时修改空闲链表的表头指针。“合适”尊循的原则是:如果申请的长度n在128字节以下的,那么总是交付长度为L的空闲片断,L是8的整数倍值中大于n的最小数;若申请的长度大于128且小于等于256,那么交付256字节的片断,大于256小于等于512则交付512字节的片断,更大长度的依此类推,直至2048字节。3.6.4SQL预处理及简单优化通过上面的算法,可以得到计算机能够理解的单位体栈(也称为单位体链表、原子链表),这样就具备了执行该SQL语句的必要条件。为了提高效率,需要对SQL语句做部分预处理,将冗余信息去除掉。冗余的信息是指可以直接计算出结果的信息,比如无效括号、子查询、数值运算、比较运算、集合运算以及逻辑运算等等。具体为:(1)无效括号是指括号内只含有一个单位体:这样就可以把该单位体前后的左括号和右括号删除;(2)子查询必须要在扫描之前获得其结果,这样做的好处是避免在扫描每条记录时再去计算其结果,其优化结果为一个集合单位体;(3)数值运14第三章嵌入式数据库的分析与设计算包括混合运算,若这些运算符前后不是变量,则可提前计算;比较运算主要包括>、<、=、>=、<=、!=,同样,若这些运算符前后不是变量的话,则可以立即计算其结果,并生成一个逻辑单位体,并代替原先单位体;今集合运算主要是指IN,ANY,ALL,NOTIN,EXISTS,NOTEXISTS运算,其后面一般是一个集合类型的单位体(子查询的(4)逻辑运算主要是结果就是一个集合单位体),计算结果也是一个逻辑单位体;not,and,or三种逻辑运算符,若其前后为逻辑单位体,则可立即合并。预处理后的单位体栈,只剩下与变量相关的单位体系列。这里的变量是指具体某个表的某个属性.预处理的算法是基于不断优化的思想,也就是说,设一个优化次数变量,每次循环开始时将优化次数P置0,以后每优化一次,该变量加1,到最后判断该变量是否为0,若为0,则说明已经没有可以再优化的单位体系列,也就是说达到了最优化,这时可以退出循环。之所以采用不断优化的算法,是因为在前一次优化的基础上,有时候还有可能进行二次优化n9|。单位体栈(或称原子链表、单位体链表)经过优化后,需要根据SQL语句的类型送交不同的SQL执行模块。由于EDB系统相对来说是小型系统,数据库原理中的一些更高级的优化思想就没有在系统中过多考虑。3.6.5重要SOL语句的设计前面已经提到,基本表是嵌入式数据库系统操作的核心,而基本表的创建和删除又是嵌入式数据库系统中最基本的操作之一,嵌入式数据库系统的其它操作都必须在创建成功的基本表基础上进行乜0|。现对本系统使用的主要数据结构描述如下:structDb{、char木zName;/木Nameofthisdatabase木/Btree鲁pBt;|嶙TheB★Treestructureforthisdatabasefile★|HashtblHash;|嘎Alltablesindexedbyname★lHashidxHash;|’All(named)indicesindexedbyname’|HashtrigHash;l嚏Alltriggersindexedbyname★|HashaFKey;u8inTrans;ul6flags;void毒pAux;卜Foreignkeysindexedbyto-table★|/木0:notwritable.1:Transaction.2-Checkpoint木/产Flagsassociated、析ththisdatabase堆/}肆Auxiliarydata.UsuallyNULL彝}freepAux木/void(木xFreeAux)(void枣);/幸Routineto);l5嵌入式数据库的设计与实现structTable{净Nameofthetable★|char*zName;intnCol;|’Numberofcolumnsinthistable^|Column*aCol;intiPKey;净Informationabouteachcolmnn'|严Ifnotlessthen0,useaCol[iPKey】astheprimar),key宰/Index卑pIndex;|毒ListofSQLindexesonthistable.’{hattnum;严RootBTreenodeforthistable(seenoteabove)枣/Select*pSelect;降NULLfortables.Pointstodefmifionifaview.★|u8hasPrimKey;l’Treeifthereexistsu8aprimarykey^IkeyConf;|★WhattodoincaseofuniquenessconflictoniPKey★|onTrigger★pTrigger;|是ListofSQLtriggersthistable^|thistable‘lFKey★pFKey;|噜Linkedlistofallforeignkeysin>;struct・Index{char*zName;int卜Nameofthisindex★|thetableusedbythisindex★|nColumn;l蠢NumberofcolumnsinSQLtablebeingcontainingint*aiColumn;|肆WhichTable★pTable;|嶙Thehatcolumnsareusedbythisindex.1stis0★|indexed^|mum;|鼻Pagerootofthisindexindatabasefile囊|byu8autoIndex;严Trueifisautomaticallycreated(ex:UNIQUE)幸/Index*pNext;“产Thenextindexassociatedwiththesametable宰/。);struct一Token{严Textofthetoken.NotNULL-terminatedt宰/constchar木z:);(1)创建基本表创建基本表通过API调用createtable实现。由使用者输入基本表名和该基本表的属性列定义,在接口处理层将用户的输入转变为EDB系统能识别和操作的创建表结构。当遇到CREATE,TABLE和表名以后,CreateTable函数被调用。此函数首先用新建表的表名与字典记录表中的表名比较,如果新建表表名已经存在,则提示错误退16第三章嵌入式数据库的分析与设计出,否则分配并初始化表结构,最后产生打开主表的操作码,具体操作如图3—6所不o在事弗中捕八一条记录'll结束图3-6基本表创建流程图基本表创建源代码:staticintCreateTable(Btree木pBt,int木piTable){MemPage奉pRoot;PgnopgnoRoot;intre;rc=allocatePage(pBt,&pRoot,&pgnoRoot,0);if(re)returnrc;zeroPage(pBt,pRoot);pagerunref(pRoot);木piTable=(int)pgnoRoot;return0K;)17嵌入式数据厍的设计与买现(2)删除基本表调用deleteTable函数来删除基本表。基本操作过程是:首先从字典表中查找要删除的表名,若是表名不存在,则提示错误退出,否则清空表中的记录,然后删除表结构和与此表相关的索引结构,最后在字典表中删除包含此表名的记录以及与此表相关的索引名记录,具体流程如图3-7所示。I在事弗表审删除包耆此表信息记录jRl索弓I记晕◆l基本表删除源代码:void纣柬|图3-7基本表删除流程图DeleteTable(DB木db,Table宰pTable){hati;Index水plndex.木pNext;FKey木pFKey,宰pNextFKey;if(pTable一---0)return;产Deleteallindicesassociatedwiththistable’lfor(pIndex=pTable->plndex;pIndex;pIndex邓Next)第三章嵌入式数据库的分析与设计{pNext=plndex->pNext;assert(pIndex->iDb----pTable一>iDbll(pTable一>iDa0&&plndex一>iDb—1));Deletelndex(db,pIndex);)for(pFKey=pTable->pFKey;pFKey;pFKey=pNextFKey){pNextFKey2pFKey->pNextFrom;assert(pTable->iDb<db->nDb);Free(pFKey);)|粤DeletetheTablestructureRself.・★|for(i=0;i<pTable->nCol;i++){.EDBFree(I:ITable->aCol[i].zName);EDBFree(pTable一>aCol[i].zDflt);EDBFree(pTable一>aCol[i].zType);>EDBFree(pTable->zName);EDBFree(pTable->aC01);EDBSelectDelete(pTable->pSelect);EDBFree(pTable);>(3)插入记录插入记录的主要过程为:首先在字典表中查找要插入记录的表名,若不存在,则提示出错退出。然后比较列的列表参数,如果列名与表中的列名不符,则提示出错退出。如果表名和列名都正确,那么插入数据到表中。如果此表没有索引,那么插入操作完成。如果此表有索引,那么还要更新索引表,具体流程如图3-8所示。19嵌入式数据库的设计与实现图3-8记录插入流程图记录插入源代码:voidDatalnsert(/幸Parsercontext枣/产Nameoftableintowhichweareinserting枣//木Listofvaluestobeinserted木/件ASELECTsmtememtouseasParse宰pParse,SrcList宰pTabList,ExprList木pList,Select木pSelect,thedatasource木/IdList木pColumn,intonErrorpColumnnamescorrespondingtoIDLIST.牛/严Howtohandleconstrainterrors・/){第三章嵌入式数据库的分析与设计db=pParse一>db;产定位需要插入数据的表宰/zTab=pTabList->a[O].zName;nColumn=pList->nExpr;dummy.nSrc=0:for(i=0;i<nColumn;i++1if(pColumn){for(i=0;i<pColumn一>nld;i++){pColumn一>a[i].idx‘2-1;)for(i=0;i<pColumn->nId;i++){for(j=0;j<pTab->nCol;j++){if(EDBStrlCmp(pColumn一>a【i】.zName,pTab・>aCol[j].zName)一0){pColunm一>a[i】.idx2j;if(j一--pTab->iPKey){keyColumn=i:)break;)}if(j>=pTab->nC01){if(EDBIsRowid(pColumn->a[i】.zName)){keyColumn=i;)else{EDBErrorMsg(pParse.”table%ShasnOcolumnnamed%s",pTabList,0,pColumn->a[i】.zName);pParse->nErr++;gotoinsert_cleanup;))}21)(4)更新记录更新函数的运行过程与删除函数相似,唯一的不同就是把删除记录改为更新记录,具体流程如3—9所示。图3-9更新记录流程图更新记录源代码:voidEDBUpdate(Parse宰pParse,产111eparsercontext・/SrcList*pTabList,产Thetableinwhichweshouldchangethings幸/22第三章嵌入式数据库的分析与设计ExprList・pChanges./宰Thingstobechanged宰/Expr木pWhere./奉TheWHEREclause.Maybenull木/intonError严Howtohandleconstrainterrors掌/){//定位所需更新的表aXRef=EDBMalloc(sizeof(int)+pTab一>nC01);if(a№f釜O1gotoupdate_cleanup;for(i=0;i<pTab->nCol;i++)aXRef[i】2-1;if(row_triggersexist){newldx=pParse->nTab++;’oldldx=pParse一>nTab++;)pTabList一>a【O].iCursor=iCur=pParse・>nTab++;for(pldx=pTab一>plndex;pIdx;pldx=pldx->pNext){pParse->nTab++;)chngRecno20:for(i=0;i<pChanges・>nExpr;i++){if(ExprResolvelds(pParse,pTabList,0,pChanges->a[i].pExpr)){gotoupdate_cleanup;)if(ExprCheck(pParse,pChanges->a[i】.pExpr,0,0)){gotoupdate_cleanup;)for(j=O;j<pTab->nCol;j++){if(StrlCmp(pTab一>aCol[j].zName,pChanges一>a[i】.zName)一0){if(j一--pTab一>iPKey){chngRecno=1;pRecnoExpr=pChanges・>a[i].pExpr;)aXRef[j]=i;.23嵌入式数据库的设计与实现if(j>=pTab->nC01){if(IsRowid(pChanges->a[i】.zName)){chngRecno=1;pRecnoExpr=pChanges->a[i].pExpr;}else{ErrorMsg(pParse,”nogotoupdate_cleanup;suchcolumn.%s”,pChanges一>a【i】.zName);>for(nldx=nldxTotal=0,pldx=pTab一>plndex;pldx;pldx=pldx->pNext,nIdxTotal++){if(chngRecno){i=O;}else{for(i=0;i<pldx->nColumn;i++){if(aXRef[pIdx・>aiColumn[i]]>=0>)if(i<pIdX一>nColumn)md刈斗;1break;>(5)查找记录EDBSelectNew函数实现记录的查询操作。查询分为3种情况。第一种就是没有where条件,该查询为按记录号查询,实现的是所有记录从头到尾的查询,这种情况下Select,结构体中的指针为空:第二种是按属性列(不是索弓IYU)查询,这种情况与24第三章嵌入式数据库的分析.oj设计第一种类似,只是从头到尾都根据where条件中的列表达式比较,符合则放入到栈中;第三种是索引查询,此种方式在数据量大的时候实现了快速查询,也是本文要重点讲述的查询方式,具体流程如图3-10所示。“图3—10查找记录流程图查找记录源代码:Select幸EDBSelectNew(ExprList^pEList.|嚏whichcolumnstoincludeintheresult★|SrcList鼻pSrc,j|嘎theFROMclause一一whichtablestoscan|l。Expr丧pWhere、|愧theWHEREclause^lExprList鼻pGroupBy,|嚏theGROUPBYclause^|Expr木pHaving./宰theHAVINGclause宰/ExprList木pOrderBy,/枣theOI己DERBYclause木/intisDistinct,≯trueiftheDISTINCTkeywordispresent鼻|25嵌入式数据库的设计与实现intnLimit,imnOf.fset产LIMITvalLie..1meansnotused,I‘//枣OFFSETvalue.0meansnooffset堆/){Select事pNew;pTab・>zName2zTabName?StrDup(zTabName):O;pEList=pSelect->pEList;pTab->nCol=pEList一>nExpr;assert(pTab->nCol>0);pTab一>aCol=aCol=EDBMaUoc(sizeof(pTab一>aCol[0])宰pTab->nC01);for(i=O;i<pTab・>nCol;i州{Expr牛P.宰pR;if(pEList->a[i】.zName){aCol[i].zName=EDBStrDup(pEList->a[i】.zName);}elseif(①=pEList->a[i].pExpr)->op一---TK_DOT&&(pR_叩->pRight)!=0&&pR->token.Z&&pR一>token.z[O】){intcnt;SetNString(&aCol[i].zName,pR->token.z,pR->token.n,0);for(j=cnt=0;j《;j什)<if(EDBStrlCmp(aCol[j].zName,aCol[i].zName)-一--O){intn:charzBuf[30];sprintf(zBuf,”—%dfI,++cnt);n=strlen(zBuf);SetNString(&aCol[i].zName,pR->token.z,pR一>token.n,zBuf,n,0);J=-l;}}}elseif(p->span.z&&P一>span.z[O]){EDBSetNString(&pTab一>aCol[i].zName,p->span.z,p->span.n,0);)else{charzBuf[30];26第三章嵌入式数据库的分析与设计sprintf(zBuf,”colunm%d”,i+1);aCol[i].zName>Dequote(aCol[i].zName);}pTab一>iPKey=-1;returnpTab;2StrDup(zBuf);(6)删除记录此函数的输入是要删除的表名,where条件可以没有,此时指删除表中的所有记录。此函数的的删除过程为:首先在字典表中检查要删除的表名,如果不存在,则提示错误退出,然后检查where条件参数,若为空,则直接清空表中的数据,若有where条件从句,则先比较条件中的列名是否在表的列中出现,若列名不存在,则提示错误退出,否则进行记录的删除工作,此删除过程分为两步,第一步是从头到尾扫描表,若记录满足where条件,则把满足条件的记录的记录号放入到一个整数队列中。第二步是按队列中的记录号删除表中的记录。若此表还有索引,则还要更新索引记录,删除记录流程如图3-1l所示。27嵌入式数据库的设计与实现图3—11删除记录流程图3.6.6索引设计本数据库采用B#树索引结构,B#树能适应随机查找和顺序查找,并且能在很大程度提高数据库的空间利用率。索引结点结构主要包括5个部分,FileHeader(数据库文件头页,它只存在于每一个数据库文件的第一页,其它的中间页或是叶子页都没有这一项),PageHeader(结点头部),CellUnlocatedPionterarray(索引项指针数组,指向cellcontentarea),space(指暂时还没分配去的,或是己被系统回收的空间),cellcontentarea(指每个cell的数据集合),如图3-12所示:第三章嵌入式数据库的分析1j设计图3-12索引节点结构示意图1.索引查找算法设计在B#树中,继承了B+树的优点,区别在于B#树中可能有溢出页,也就是在查找关键字时,如果在叶子结点中如要没有发现要查找的关键字时,还需要检查溢出页,如果溢出页存在,继续在它的溢出页顺序查找,如果查找成功,则查找结束。在B#树中,如果关键字在叶子结点中,则跟B+树查找方法一样,这里不需要多说,如果关键字出现在溢出页中,专为查找B#树的溢出页中关键字设计了函数findoverflowCell(),用它来查找B#树的溢出页中的关键字。staticu8木findOverCell(MemPage木pPage,intiCell){inti;for(i=pPage->nOverflow-1;i>=O;i一、{intk:struct—OvflCell宰pOvfl;pOvfl=&pPage->aOvfl[i];’k=pOvfl;if(k<=iCell){if(k—iCell){returnpOvfl一>pCell;29嵌入式数据库的设计与实现_}iCeU--;))>2.索引插入算法设计在B+树索引机制中,如果发现叶子结点已满,待插入的关键字一插入,就会引起结点的分裂。叶子结点一分为二,把关键字平均分配到两个结点,中间关键字提升,更新父结点中的关键字,完成了一次结点分裂的操作。在B#树索引机制,当发现叶子结点己满,会先查找它的左右2N个兄弟个是否有未分配的空间,如果没有,再查找它的溢出页中是否已满,如果未满,则直插入到溢出页,否则,进行结点分裂。在B#中,如果要插入一个关键字,首先调用函数查找树中是否存在关键字,如果关键字存在,直接返回。当关键字不存在于B#树中,假如叶子结点空间己满,则检查它的左右2N个兄弟结点是否存在未分配的空间,如果是,则通过Balancesort函数来腾出空间,再把关键字插入到合适的空间中,并保持叶子结点间关键字有序。如果左右兄弟的结点都己满,则检查它溢出页是否存在未使用空间,如果存在,则插入溢出页,否则调用函数defragmentPage来分裂结点,把关键字插入分裂后的空间,并调用函数Balance保持叶子结点关键字的有序。3.索引删除算法设计在B#树中,如果结点发生关键字删除操作,如果该关键字在叶子结点中,删除后,判断它的溢出页是否存在,如果存在,则将溢出中的关键字移到叶子结点中,并保持叶子结点中关键字原有顺序,如果不存在,则检查其同父结点的2N个左右兄弟是否存在溢出页,如果是,则通过“动态平衡”,腾出空位,把溢出页中关键字移到叶子结点中,并保持叶子结点关键字原有顺序,如果否,则检查该结点和它的同父结点的2N个兄弟结点,能否同时容纳于2N个结点中,如果能,则进行合并,删除一个结点,进行“动态平衡",保持2N个结点中关键字原有顺序,如果不能,用动态平衡算法把关键字平均分配到2N+1个结点中,并保持原有顺序。如果删除的关键字在溢出页中,则删除过后,判断溢出页是否为空,如果是,则由于系统回收该溢出页,否则保持溢出页中关键字有序。30第四章基于ARM的嵌入式数据库的实现第四章基于ARM的嵌入式数据库的实现4.1硬件平台的搭建4.1.1ARM开发平台介绍ARM微处理器是一种高性能、低功耗的32位微处器,它被广泛应用于嵌入式系统中,ARM是一家英国公司,它的文字含义是AdvancedRISCMicroprocessor(高级RISC微处理器)。ARM为客户提供16/32位嵌入式RISC微控制器方案,将其RISC处理器授权给电子公司使用,在便携式通讯,手持计算设备,消费类和数字化多媒体方案中,ARM正有一种成为标准的趋势n91。4.1.2S302410开发板介绍三星(Samsung)¥3C2410是一款著名的移动设备处理器产品,最著名的应用是在惠普的iPAQ系列PDA上,¥3C2410有两个型号:¥3C2410X和¥3C2410A,A型是X型的改进型,相对来说具有更好的性能和更低的功耗,¥3C2410主要面向手持式设备以及高性价比、低功耗的应用,现在市面上许多高性能的PDA、手机、数码相机、机顶盒等均采用¥3C2410为处理器。4.2嵌入式Linux开发环境的建立4.2.1嵌入式Linux开发环境的基本结构由于嵌入式设备没有足够的内存以及存储资源来完成其编译过程,所以就在主机上完成针对目标的代码编译生成,这个过程称为交叉编译。这也是目前大多数嵌入式设备开发所使用的编译方式。为了提高嵌入式Linux的开放效率,一个完善的嵌入式Linux开发环境是必不可少的。嵌入式Linux开发环境一般由如下几部分构成:Linux服务器(宿主机)、工作站、嵌入式目标系统和将它们连接在一起的网络环境,其具体结构如图图4-1嵌入式开发环境基本结构图中所示的嵌入式Linux开发环境中,Linux服务器作为嵌入式Linux内核编译、应用程序编译的公共平台,由单独的一台PC机充当,安装常用的桌面标准Linux操3l嵌入式数据库的设计与实现作系统,如RedhatLinux等。工作站即为普通的局域网计算机,可以是一台或多台,以支持小组项目开发。工作站一般安装常用的windows操作系统,仍然可以完成各种日常工作。当需要使用Linux服务器资源时,就从工作站远程登录到Linux服务器,以完成各项需要的操作。工作站作为开发人员的操作终端,可能需要经常登录Linux服务器和工作站之间进行文件的传输,因此,一般需要在工作站上安装FT,客户端程序(如Cuteftp等)和Telnet客户端程序(如SecureCRT等)。当Linux服务器的FTP服务和Telnet服务运行时,开发人员就可以方便地在工作站和Linux服务器之间进行文件传输,并可以通过Telnet方式登录到Linux服务器,并对其进行相关操作。4.2.2在Linux服务器上安装交叉编译工具1.获取交叉编译工具・开发基于Linux的应用程序,一般的步骤是先编写程序源代码,然后编译调试,最终生成可执行程序。交叉编译工具一般由专门的机构负责维护,可以从他们的网站上免费取得㈨。2.安装交叉编译工具下载的交叉编译工具以压缩的方式存在,需要将其安装到Linux服务器上。这里把交叉编译工具安装在Linux服务器的/usr/local/目录下,执行如下操作,建立/usr/local/arm目录,并将下载的交叉编译工具复制到该目录下乜引:#cd/usr/local#mkdirarm(进入目录/usr/local)(建立子文件夹)(拷贝文件)#cp/home/work/cross一2.953.tar.bz2输入如下命令解压安装编译工具:#tarzxvfcross一2.95.3.tar.bz2(解压缩文件)当以上命令执行完毕以后,会生成/usr/10cal/arm/2.95.3子目录,表明交叉编译器已经成功安装到了/usr/local/a瑚下。安装后会在该目录下生成如下的文件和目录:arm-Linuxbinincludeinfolibmansharetest—if—write其中,bin目录下是交叉编译器和一些工具,如编译器amt—Linux—gcc是C交叉编译器,arm-Linux—g++是C++编译器,arm-Linux—as是汇编器,arm—Linux—Id是链接器。Lib目录下存放的是库文件,包括gcc库、1ib-gcc库、lib—g++库等。/include目录存放编译器的头文件,包含了标准C的头文件、Linux的头文件、32第四章基于ARM的嵌入式数据库的实现特定处理器相关的Linux头文件等。在以上工具中,arm-Linux-gcc作为基于ARM架构的C编译器,在系统开发过程中是最为常用的㈨。4.2.3嵌入式LInux内核的配置与编译Linux最大的特点是内核具有非常良好的结构,可由用户根据特定的系统需求,对内核进行配置或裁剪,而这一特点恰恰满足了嵌入式应用的差异性需求心利。1.获取Linux内核源代码Linux内核由专门的机构维护,可以从Linux内核的官方发布网站::http://嗣wkemel.org上获取功能完善的最新内核。2.Linux内核配与编译本系统的Linux内核编译步骤如下:1)整理出系统需要支持的硬件、文件系统类型以及网络协议等内容,以便配置内核时选择所需的软件支持。2)下载并解压Linux内核,因为安装系统时所安装的源代码默认情况下支持很多设备,这样给内核裁减降低了难度。一般都将Linux内核源代码放在/usr/src下。3)清除从前编译内核时残留的文件和不必要的关联:cd/usr/src几inux(进入文件夹)makemrproper(清除不必要的关联)确保源代码目录下没有不正确的文件和文件依赖关系,执行该命令后,内核选项会回到默认的状态下。本系统是下载的内核源码,而且是第一次编译,所以就不必执行这一步操作。4)配置内核,修改相关参数一+。’本系统需要选择的模块有:Supportforpagingofanonymousmemory(swap)//支持虚拟内存Enableloadablemodulesupport(CONFIGMODULES)//动态装载模块功能Networkingsupport(CONFIGNET)//网络支持TCP/IPnetworking//TCP/IP协议等系统必须的功能模块。5)运行makeclean,清理一些不必要的文件,如果在上次编译的基础上,删去了一些选项就必须执行这一步操作。6)编译内核33嵌入式数据库的设计与实现编译内核的命令是:make4.2.4根文件系统的制作zImage对于嵌入式Linux来说,最简单、最常用的根文件系统是RAMDISK。RAMDISK就是指使用系统的一部分内存空间来模拟一个用户熟悉的磁盘分区,用户在RAMDISK上进行的所有操作都与传统的磁盘文件操作一样。因此,对于无盘系统或嵌入式系统,选择RAMDISK作为根文件系统是很适合的。在实际的应用过程中,通常采用的方式是从开发系统提供商获得一个已经做好的RAMDISK然后由用户根据自身系统的实际需求,对己有的RAMDISK进行增减,最终形成一个适合自身应用的RAMDISK。1.RAMDIK的制作1)首先为根文件系统创建空的文件镜像:mkdir/rantinitrddd//创建目录・-if=/dev/zeroof=initrd.imgbs=lkcount=8192//确定文件系统大小mkfs.ext2一Fmouninitrd.img//¥U作文件系统itrd.img/mnt/initrd//挂载t一0loopin上面命令创建了一个8192KB的文件系统镜像,并通过dev/zero进行初始化。2)创建目录,上面的命令创建了一个RAMDISK,要用必要的文件填充它:mkdirdevprocetcsbinbinlibmntusr。2.利用已有的RAMDISK本系统的RAMDISK是这样实现:解压系统提供商的RAMDISK:gzip—dramdisk.gz,将文件挂载到一个临时目录:#mkdirram—diskram_disk#mount‘。0loopramdisk#1S根据本系统的需求,对相关文件进行增减操作,即可以往目录复制或删除一些文件。操作好后对新的RAMDISK文件进行压缩:#umount/ramdi#gzipramdisksk//卸载//压缩文件系统这样生成一个新的RAMDISK。有了嵌入式Linux和根文件系统,一个完整的嵌入式Linux系统就编译完成了。34第四章基于删的嵌入式数据库的实现4.2.5网络文件系统(NFS)及配置首先在Linux服务器上设置:以Root身份登录Linux服务器,编辑共享目录配置文件export,指定共享目录及权限等。执行如下的命令编辑文件:etc/exports#vi/etc/exports(编辑exports的内容)在该文件中添加如下内容:/home/work192.168.1水添加的内容表示IP在192.168.1.木的计算机以读写的权限来访问/home/work目录。/home/work也称为服务器输出共享目录。接着执行如下命令,启动端口映射:#/etc/rc.d/init.d/protmapstart最后执行如下命令启动NFS服务,此时NFS会激活守护进程,然后就开始监听客户端的请求:#/etc/rc.d/init.d/nfsstart在NFS服务启动后还要检查Linux服务器的防火墙等设置,确保没有屏蔽掉NFS使用的端口和允许通信的主机。首先在Linux服务器上进行NFS服务器的回环测试,验证共享目录是否能够被访问。在嵌入式系统上运行如下命令。#mount-tnfs192.168.1.1:/home/work/mnt命令将Linux服务器的NFS输出共享目录挂载到/mat目录下,因此,如果NFS工作正常,应该能够在/mnt目录中看至U/home/work共享目录中的内容。在Linux服务器设置好以后,接下来需要进行客户端的设置。首先需要运行在嵌入式目标系统的Linux内核支持NFS客户端,在嵌入式目标系统的Linuxshell下,执行如下命令进行N
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度车辆转让合同协议书电子版标准模板
- 互联网与传统文化保护与创新考核试卷
- 医疗器械临床评价与风险管理考核试卷
- 2025-2030全球自适应前照明系统(AFLS)行业调研及趋势分析报告
- 2025-2030全球搅拌装置行业调研及趋势分析报告
- 高财课程设计自我鉴定
- 风变编程课程设计团队
- 带式课程设计
- 铁路项目管理课程设计
- 齿轮轴生产课程设计
- 专题6.8 一次函数章末测试卷(拔尖卷)(学生版)八年级数学上册举一反三系列(苏科版)
- GB/T 4167-2024砝码
- 老年人视觉障碍护理
- 《脑梗塞的健康教育》课件
- 《请柬及邀请函》课件
- 辽宁省普通高中2024-2025学年高一上学期12月联合考试语文试题(含答案)
- 《个体防护装备安全管理规范AQ 6111-2023》知识培训
- 青海原子城的课程设计
- 2023年年北京市各区初三语文一模分类试题汇编 - 作文
- 常州大学《新媒体文案创作与传播》2023-2024学年第一学期期末试卷
- 麻醉苏醒期躁动患者护理
评论
0/150
提交评论