Symbian类基础知识(一)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Symbian基础类知识!!!〖SymbianOS简介〗1.1SymbianOS的六大特性1、操作系统是运行在ROM上的2、系统是运行在电池驱动的设备上的3、完全是面向对象的4、基于组件的设计5、被设计成确保用户的数据不会丢失6、简单的UI系统Symbian是真正的微核操作系统,所谓“微核”,就是说操作系统只有很小的一部分是运行在最高优先级的,其他的功能都是以Client-Server的方式提供。下面是Symbian系统的内部结构图:应用层:Shell,OPL,及其他应用程序------------------------------------------------系统层:Dialogs,Menu,Toolbar,Icons,Resources,JavaVM,Grid,RichText,EditControl,ListControl,ApplicationFramework,JaveClassLibraries.------------------------------------------------服务层:WindowServer,ProcessServer,SocketServer,SoundServer,WirelessServer,DatabaseServer,FileServer,AlarmServer,CommsServer,以及无线协议------------------------------------------------内核:euser.dll,ekern.exe,服务控制(supervisorserver),HAL(设备抽象层)------------------------------------------------驱动程序层:包括音频驱动,显示驱动,MMC驱动,键盘驱动,串并口驱动,DSP驱动,时钟控制器驱动等等1.2SymbianUI系统命名使用过SymbianUI系统的同志们一定都听说过一些奇怪的名字,比如:Eikon,Cone,Apparc,Avkon等等,这么多kon字辈的东东到底有什么关系呢?首先,大家要明白,在kon字辈的同志们中,Cone和Apparc是老大,其他kon们都是从这两个kon继承来的。先说说Cone。Cone就是ControlEnvironment(控制环境)的缩写。Cone是Client端的控制环境。这个东东定义了GraphicUI中一些基础的东西,没什么代码,但是是一种DesignpatternApparc是ApplicationArchitecture的缩写。Applicationarchitecture定义了Symbian应用程序的框架。主要是定义了CApaApplication,以及CApaDocument这两个类,也就是d&v结构。然后还定义了程序启动以及数据控制流等等。kon们其实就是控件组,关于控件的用法以后再说。Series60用的是Avkon,Series90用的是Ckon,大家可以理解为不同的kon是专为不同屏幕大小的手机设计的不同的控件库。以Series60为例:Avkon-----Eikon-----Uikon-----Cone+Apparc===================================================〖SymbianOS内存管理介绍〗在SymbainOS中内存管理的主要任务是:如何为程序分配内存以及如何在程序的内部分配内存。SymbianOS程序最根本和基础的东西就是内存,作为一个有限的资源,必须小心细致地处理,特别是当有错误或异常发生的时候。正是由于这样的原因,在支持清理机制的API中,异常处理和内存管理几乎是绑在一起的。Uikon核心框架使用这些支持清理机制的API来管理内存,使GUI程序的基础架构具有良好的性能和表现。GUI程序还支持异常情况下内存清理,以及调试模式下的内存泄露检测。一、SymbianOS的清理机制(cleanup)清理机制是SymbainOS程序对于程序异常处理的一种特有方式。当异常发生时,清理机制将清理错误的内存区域。SymbianOS的清理策略和它所有类的基类CBase类有着密切关系。要了解SymbianOS清理机制就必须清楚以下三个概念:异常处理(exceptionhandling)、清理栈(cleanupstack)以及通用清理项(generalcleanupitem)。1、异常处理(ExceptionHandling)SymbianOS没有使用C++的try…catch异常处理方式,而是使用了它自己所特有的方式:leave。在SymbianOS中,异常以leave的形式出现,trapharness可以在程序中设置一个点,使程序发生leave时回跳到这个点上,宏TRAP和TRAPD可以在程序中设置这个点。调用系统APIUser类的一些静态函数可以触发Leave,例如User::Leave()方法,这就相当于主动地抛出异常,当然某些系统函数或是用户代码,也有可能发生leave。2、清理栈(CleanupStack)当leave发生时,任何分配了资源的heap内存,例如通过new()方法创建的对象,他们将被孤立,因为leave一旦发生已指向他们的指针就不存在了,这样就导致了内存泄漏。为了防止内存泄漏发生,程序就有要记录那些已经被创建的对象,如果程序运行发生leave,那么系统可以自动找到并清理他们所占用的内存。这些工作可以通过清理栈来完成。CleanupStack类是支持清理栈的一个类。GUI应用程序拥有一个由应用程序框架所提供的清理栈,其他的应用程序必须用CTrapCleanup类自己构建一个清理栈。3、通用清理项(GeneralCleanupItem)在默认情况下,清理栈只处理那些CBase-based类(也就是它所处理的类必须是由CBase类继承下来的)和那些untyped类型对象(用一个简单的内存释放语句就可以释放的对象)。通用清理项(GeneralCleanupItem)使其他类型的对象也可以放到清理栈中。TCleanupItem类是支持通用清理项的一个类。二、SymbianOS的内存分配内存分配管理的目的在于能够使SymbianOS进程通过底层函数访问和操纵内存区域。绝大多数的客户端程序不需要直接使用这些函数,那些在进程间共享内存区域以及在一个进程的线程间共享内存区域的程序会使用这些底层函数来管理内存。这里有两个概念需要了解chunk(块)和heap(堆)。1、Chunk(块)chunk是一组线性相邻的内存地址在RAM中的映射。进程创建以后,它的地址空间包括1到3个chunk:(1)stack/heapchunk:这里包括了进程的主线程所要使用的stack和heap。所以这个chunk通常是进程所必须的。(2)codechunk:这个chunk只有当进程被加载到RAM时才出现。(3)datachunk:只有当进程拥有静态数据的时候才会有这个chunk。当然,程序可以还创建额外的chunk。一个全局的chunk可以被其他进程访问,这样就实现了大量内存的共享。RChunk类提供了对chunk的支持。TFindChunk类可以用来查找其他进程创建的全局chunk。2、Heap(堆)heap通常用于显式的动态内存分配。SymbianOS定义了C++中new操作符创建对象到当前线程的heap中。Heap的功能可以是:?监控内存泄漏:对于一个GUI程序来说,这个是经常发生的。?在同一进程的线程间进行共享。?在单元一级上进行访问和操作。RHeap类提供了对heap的支持。如果heap是当前线程的heap,那么使用等价系统静态方法API的User类将更加方便。这些系统静态方法API同样也提供了宏来管理内存,以防止内存泄漏。三、进程和地址空间SymbianOS的程序可以包含若干进程,每个进程包含若干在概念上并发执行的线程。每一个用户进程都有他自己私有的地址空间。一个用户进程不可以直接访问另外一个用户进程的地址空间。进程包括若干线程,他们运行在进程的特权级。Kernel进程是一个比较特殊的进程,它的线程运行在超级访问者级别,这个进程通常包括两个线程。Kernelserver线程:是一个原始的进程,在系统启动时就已经存在。它可以在heap执行核心函数请求的内存分配或重新分配。null线程:当系统中没有其他可运行的线程时这个线程就开始运行,null线程使处理器处于空闲状态,减少耗电线程的地址空间包括若干chunk,在刚创建的时候,进程只有一个线程和1到3个chunk。如果进程创建了新的线程,那么一个新的chunk将被创建被分配给这个线程。每一个chunk都包括一个了stack,如果线程没有共享当前heap,那么在chunk中也将包括heap。四、Chunks(块)Chunk把RAM映射到一个连续的虚拟地址。一个chunk中包括了一个保留区(reservedregion)和和委托区(committedregion)。保留区是一个连续的虚地址区域,它的大小可能是整个chunk的大小。在委托区中存放了真正映射到RAM的地址。chunk的大小是可以被动态修改的,允许委托区也可以修改大小,他的范围是从0一直到保留区大小,是处理器页面大小的整数倍。这样,就允许进程获得更多的内存空间。通常,委托区起始地址位于保留区底部。另外还可以创建double-endedchunk,那么委托区将是保留区的任意连续子集,他的大小也是处理器页面大小的整数倍,这种Chunk的委托区可以有两个顶端和底端,并且它们的大小也是可变的。在chunk创建时可以指定chunk的最大空间,保留区大小应该小于这个最大值。.尽管这样,如果保留区请求比当前chunk更大的空间,那么chunk可以被重新分配空间,以允许保留区扩大。保留区可以扩大到撑满整个chunk.。Localchunks(本地chunk)如果一个chunk对于创建它的进程是私有的,不允许被其他用户进程访问,那么那么这个chunk就是本地chunk,本地chunk是没有名字的。Globalchunks(全局chunk)如果一个chunk可以被其他进程访问,那么这个chunk就是全局chunk。全局chunk是有名字的,这样,进程可以根据chunk的名字来访问他们。当进程打开一个全局chunk的时候,他把chunk映射到自己的地址空间,这样就可以对chunk进行直接访问和数据共享了。如果已经知道了chunk的名称,那么使用RChunk::OpenGlobal()可以直接打开chunk.。如果只知道了chunk的部分名字,那么可以使用带TFindChunk型参数的RChunk::Open()方法来打开chunk.。五、Heaps(堆)Eachthreadhasachunkwhichcontainsthatthread'sprogramstack.Forthemainthreadofaprocess,thischunkalsocontainsthethread'sheap.Aprogram'srequestformemoryisallocatedfromthisheap.Forexample,acodefragmentsuchas:每一个线程都有一个包含了自身程序栈(programstack)的chunk。.对于进程的主线程来说,这个chunk中同样也包含了线程heap。程序对于内存的请求都是从这个heap的地址空间来分配的,例如有以下代码:CArrayFixFlat...*fixflat;...fixflat=new(ELeave)CArrayFixFlat...(3);程序请求了heap中部分的内存地址,并把地址返回给调用者。请求heap中的内存必须是显式的,同样,释放这些内存时也必须进行显式调用。Structureofaheap(heap结构)heap包括两个单元列表。一个是已经分配的内存单元列表,一个是还未分配的内存单元列表。两个列表

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功