Add

[转] 在嵌入式单地址空间OS中实现动态加载的问题


转至:http://blog.csdn.net/pengzhenwanli/archive/2007/02/26/1514689.aspx

本文的的主要想法是来源于手持设备可运行应用程序和如何实现智能机问题的思考。问题的主要来源是关于可扩充应用程序的考虑,目前大部分手机都是非智能机,也就是不能扩充应用程序

1.智能手机与非智能手机
        一般来说,智能手机目前公认三大系统,Windows Mobile,Linux和Symbian,也即是说采用这三种系统的手机,都成为智能机。我认为,从技术上来讲,智能机最主要的特征就是第一可扩充应用程序,也就是说用户可以自行安装需要的程序而不局限于手机自带的,第二就是多用户任务,也就是用户具有同时运行多个应用程序的权力。而非智能手机的操作系统可以说是五花八门,什么都有。但是基本上都有一个核心的特征,就是同时只能运行一个应用程序,而且所有的应用程序都运行在相同的地址空间,而智能机是运行在独立地址空间。一般来说,非智能机也支持多任务,不同的是这些任务共用相同的地址空间。用户操作的UI就是一个单独的任务,用户所能使用的功能基本上就是由UI提供的。
        我原来对于非智能机是非常的不屑,认为没有什么发展前途,但是我最近又弄了一个非智能机的手机用了一下,发现很多功能都非常的人性化,从使用上来讲,并不亚于智能机,由此引发了我对于非智机功能的思考。对于智能机来讲可扩充的应用程序一般来说,都是由第三方开发商开发的,稳定性都有所缺陷,并不如原生的系统应用程序稳定。而且有些比较好的用程序价格不菲,我见过使用智能机的人大部分都是使用破解的应用程序,我本人也是。这个行为是违法的,当市场成熟以后,比如像美国,是不太可能的。

        智能机由于操作系统功能强大,一般要求系统的硬件性能强劲,这样相应的功耗也大,待机时间相应的缩短。非智能机可以运行在性能较差的硬件上,并且获得的UI表现,不弱于智能机。这样就可以在相同的电力消耗的情况下,获得更长的使用时间。
2.非智能机获得智能机功能必须的要求
        如上文所说,只要非智能机实现智能机最主要的两个特征即可获得智能机的功能。一个是用户自行安装应用程序的功能。另一个是同时运行多个应用程序的功能。
3.用户自行安装应用程序的功能
        除了智能机以外,目前有两种技术都实现了用户可自行安装应用程序的功能,一个是BREW另一个是Java ME(J2ME)。下面分别说一下这两种技术,BREW技术由Qualcomm(高通)创建,包括一整套的体系,从运营到分发都有。在本文里只是对于客户端技术的说明,对于BREW技术而言,已经非常符合本文中所提及的技术,本文从另一方面来讲,也可以说是分析了BREW的基本技术。BREW技术高通把持的非常严密,目前而言,并没
有开放源代码而且对于技术内部也是进行严密的封锁,因此目前出现的文章都是猜测技术的实现,但是对于技术来讲,万变不离其宗,要实现某种技术,有些东西是绕不开的,就像使用CDMA技术,无论是WCDMA,CDMA2000,还是TDS-CDMA都无法绕开CDMA的基本专利一样。BREW技术基本达到了本文的技术要求,既能动态加载,也能同时运行多个任务,而且对于系统功能的使用不像JavaME一样有严重的限制,基本上来说,可以使用系统提供的所有功能。而对JavaME,所提供的功能十分有限,就连存取本地文件都不可以。对于系统功能的使用,如果没有附加的支持,基本上不可能,目前应用最得的是游戏,最多有些网络方面的应用。对于提供系统级别的应用,比如说闹钟等,根本无能为力。也许以后能够提供,但是本人不太看好。另外还有一个就是Flash Lite技术,这个技术我并没有接触,就不详细说了。对于BREW和JavaME我都有相当长时间的接触,了解也比较细致,有些问题还是能够说一下的。
        要解决用户可以自行安装应用程序的问题,必须解决以下几个问题,应用程序的加载运行问题,系统API的调用问题。
3.1应用程序加载
        对于嵌入系统来讲,与通常的Windows系统不一样,Windows的所用应用程序都在硬盘上,运行的时候根据需要加载到内存中,在运行,或者是使用虚拟内存技术,直接映射的硬盘也可以执行。而嵌入式系统通常是在ROM中,并不需要加载到内存才能运行,直接就可以运行,因此大部分的嵌入式系统都是统一做好一个系统的Image,然后放到ROM中运行。这样所有的地址都在编译期间确定,要是再动态加载应用程序,将会面临运行时地址确认的问题。一般而言,对于嵌入式系统,ROM使用Flash来代替,Flash中一部分作为ROM,另一部分作为嵌入式的文件系统,具体的系统格式这里不作考虑。要是可加载应用程序的话,一般来说是放在文件系统中。这样要运行可动态加载的应用程序,并不复杂,只要把应用程序调入内存中,运行时设置正确的寄存器就可以了。

这里也就是把可执行的文件加载到内存中,由于是单地址空间的,而不是像Windows一样每个应用程序都是独立的地址空间,这样应用程序可以从任意地址开始执行,这样载入内存以后,把当前的执行指针PC这为此内存地址即可。这也是单地址空间的程序可以执行的关键。

3.2系统API的提供

 要提供可以运行时call的API,在单地址空间可加载应用程序的约束条件下,可以使用的方法也非常的单调。一般来说,单地址空间的应用程序是统一编译和链接的,这样生成可执行文件以后,所有的地址已经固定了,这样如3.1所说,应用程序如果每个都调用相同的系统API,比如memset等,由于应用程序时独立加载的,这样由于在编译过程中已经把所有的地址确定,所以每个应用必须链接独立的lib,这样造成了空间浪费。如果只是单独的应用,不提供这一步,系统已经可以动态加载了。

但是目前是要求在嵌入式单地址空间实现,必须考虑空间的问题。因此必须解决系统库可以动态加载的问题。也就是库的地址不是在链接的时候确定。只要能够解决编译时的链接问题,就可以做到。

关于
4.同时运行多个应用程序的功能

Random Posts Recent Comments

  • 女友糖尿病害我蛀牙 Says:

    汗一个…...

  • Htj06 Says:

    zhenyouchuangyi...

  • 电商圈 Says:

    试图该怎么建立啊,,怎在程序中是吸纳...

  • edward Says:

    看得人心旷神怡,好文,情不自禁的顶一下...

  • Daniel Says:

    我也在处理这个问题,没有找到好的方法。我用了楼上兄弟的方法,还是可以的。不知道您找到好的方法了吗、我暂时楼上兄弟的方法。...

  • 卡,卡 Says:

    弱弱问一句:博主,你博客的模板这样设计pv高吗?...

  • 站长工具 Says:

    博主,兔年快乐!...

  • health Says:

    great post!!I hope I can read more in your website....

  • pdu Says:

    好博文,支持分享...

  • 站长工具 Says:

    博主的文章很不错,我是站长工具-站长精灵的作者,一款专业的SEO工具软件(可以帮您提高博客的流量),想跟您交换个链接,不知可否...

Tag Cloud

arm audio blog brew cache class debug flash google html j2me java javascript Joke linux lua mobile mtk php python ror ruby server shell stream unix web windows 优化 动态加载 女人 女生 平台 开发 手机 技术 流媒体 测试 漫画 生活 男人 男生 缓存 芯片