嵌入式系统中的模块动态加载技术[Java编程]
本文“嵌入式系统中的模块动态加载技术[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
择要 提出一种实用于嵌入式系统的模块动态加载技术,计划实现简单,占用资源少,开销小,并且成功应用于DeltaOS.可提高系统的机动性和扩属性.介招加载与动态链接的原理和利用情形,注释相关术语,描写基本计划思绪:具体阐明该技术的核心.即模块声明、调用库、两级重定位表,最后给出结论. 关键词 模块 动态加栽 嵌入式系统DeltaOS
引 言
随着电子技术的飞速发展,嵌人式设备利用越来越遍及,复杂度也越来越高.这使得硬件和软件计划比例发生了很大改变,软件开辟的比重越来越大.但是传统嵌入式开辟历程中需求将利用与操作系统编译链接成一个整体,然后下载到目标机上运行.假如在调试历程中发现问题,需求重新编链接然后反复下载运行的历程.这样的开辟流程周期长并且烦琐,已经越来越不适应快速市场化的需求.
为了适应多样化的嵌入式利用和加快嵌入式系统的开辟历程,除了需求坚固的底子平台软件的支持,如带有文件系统、网络协议栈的RTOS和配套的集成开辟环境,更重要的是需求可以动态扩大的系统平台.近些年来,新一代的嵌入式操作系统已经开始利用动态扩大技术:将基本系统(包含操作系统以及其他同享功效调用库)和利用程序开辟脱离处理,支持模块更新和动态加载技术.很多主流的传统嵌入式操作系统厂商,如windRiver、Green HilIs、Lynxworks,都推出了面向航空航天、底子通信设备等范畴的高坚固、高性能的RTOS版本,支持利用和系统组件的动态加载和更新;而在消费电子范畴,相关的操作系统厂商,如symbian、Palm、Microsoft,更是主动推出了具有呼应功效的操作系统,在新一代移动设备上得到了遍及利用.
为了成为可动态扩大系统平台,大部份嵌入式操作系统需求利用动态加载技术.总的来说,动态加载是指利用大概系统在运行历程中需求利用某模块的服务,于是通过一系列预定的行动将指定模块加载到系统中,让调用者持续顺利工作.它实现的关键就是加载与动态链接技术.因为加载和动态链接彼此依靠,关系精密,所以将二者放在一同举行谈论.
1 加载与动态链接机制
加载主要负责将模块程序从二级存储设备(比方硬盘大概Flash)搬移到指定内存空间,并且将模块交由系统加载器统一管理.
程序链接分为静态链接、加载时链接和运行时链接.静态链接就是将程序和它运行所需的全部库链接成一个履行文件.它的长处是可以独立运行、速度快,但是它链接生成的代码尺寸对比大.加载时链接是指程序在编译链接时不会把它用到的库链接到执路程序中,而是在它被加载器加载时才解析履行文件,顺次把用到的库装载到系统中让其运行.它的长处是程序本身代码量减小,但运行时程序占的内存并没有减小,同时增添了加载器的工作量.动态链接是加载时链接的进一步发展,它是指将库的加载历程耽误到程序运行时履行.这种方法不会给程序引入额外的代码,也不会增添加载器的开销,只有当利用真正利用某库时才会加载该库,削减了不必要的空间占用.它的缺陷是大概会有一些运行开销.
嵌入式系统中动态加载和普通的动态链接概念近似,但是嵌入式系统中的加载链接器有其自身的特点:它是穿插加载,主机端做一部份工作,比方程序的重定位,履行文件的解析等等;而目标机端相对简单,主要做模块搜索定位和空间分配,以及指定物理地址大概映射虚拟地址让其运行.一部份嵌入式系统不支持虚拟内存,利用和内核同享存储空间.当系统加载了多个利用到系统中时,普通需求利用overlap技术来办理内存空间有限的问题,便是当多个利用的运行地址空间冲突时,加载器会冻结当前暂时不运行的利用,让新加载的利用利用指定的地址空间,PairnOS中就采取了这样的计划.关于支持虚拟内存的嵌入式系统,加载器的工作被大大简化,每个利用都有可以运行在一样的虚拟的空间,不需求加载器为其重定位或利用overlap技术,因此提高了工作效率.Vxworks6.O,WinCE都利用了这种计划.两种方法在差别的范畴都有对比多的利用.
文中提出的模块动态加载技术是基于支持MMU(Memory Management Unit)的32位嵌入式操作系统,采取了加载与动态链接技术.利用该技术构建的嵌人式系统面向高端市场,分外是对系统坚固性、安全性要求很高的范畴.在DeltaOS新一代高坚固的版本HAR(High Available Reliable system)的研发历程中,即成功地实现了基于该计划的加载器LambdaLoader,到达了预期的性
能要求.
2 模块动态加载的计划
2.1 计划思绪
首先定义一些概念:模块、目标程序、接口函数地址表和调用库(call Library).
①模块,主如果指加载器加载的一个单位,并且这里模块的概念主如果夸大它是为利用大概系统供应一系列服务的供应者.
②目标程序,是指模块的利用者.它可以是利用,也可以是另一个模块.
③接口函数地址表(文中也称之为模块重定位表),指在模块中有一个数组表,该数组表的内容是该模块对外供应的函数接口的地址.
④调用库,是供模块调用者链接利用的专有库.它与相关模块一一对应,将封装了的模块接供词目标程序利用.除此以外,它还有一个运行时才肯定的模块重定位表地址指针和模块动态查找定位的代码.
假如在系统中要实现动态加载,首先需求一种模块定位机制,使得调用者可以在系统中动态定位需求的模块,其次是要能让模块与目标程序动态的关联在一同,调和工作.为了办理这些问题,需求一系列相关的计划:规定模块的声明方法;简化目标机端模块地址空间定位的工作;重定位表的机制等等.基于这样的计划,系统可以对比顺利地实现动态加载.模块动态加载的工作流程如图l所示.这里描写的主如果目标机端的工作.
2.2 模块的声明
模块首先要定义它的相关属性.这里利用模块声明文件来完成这个工作.模块声明文件中需求定义:模块名字、版本、对外供应的API接口.在系统编译模块程序后,会调用一系列的script代码.这些script会按照模块名字查找模块对应的模块声明文件,并按照该文件生成供模块调用者利用的调用库和与模块一同链接的附加库. 附加库包含系统后台通过调用script生成的接口函数地址表和模块注册函数.在每个模块的初始化函数中,会调用一个模块的注册函数(该函数主要工作是向系统注册模块的名字和接口函数地址表地址).当模块被加载时,初始化函数会被系统调用,向系统注册模块信息,此后模块交由加载器统一管理.
以上是“嵌入式系统中的模块动态加载技术[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |