快捷搜索:

嵌入式系统中的模块动态加载技术

择要

提出一种适用于嵌入式系统的模块动态加载技巧,设计实现简单,占用资本少,开销小,并且成功运用于DeltaOS.可前进系统的机动性和扩属性.介招加载与动态链接的道理和利用环境,解释相关术语,描述基础设计思路:具体阐明该技巧的核心。即模块声明、调用库、两级重定位表,着末给出结论。

关键词

模块 动态加栽 嵌入式系统DeltaOS

引 言

跟着电子技巧的飞速成长,嵌人式设备利用越来越广泛,繁杂度也越来越高。这使得硬件和软件设计比例发生了很大年夜变更,软件开拓的比重越来越大年夜。然而传统嵌入式开拓历程中必要将利用与操作系统编译链接成一个整体,然后下载到目标机上运行。假如在调试历程中发明问题,必要从新编链接然后重复下载运行的历程。这样的开拓流程周期长而且繁琐,已经越来越不适应快速市场化的必要。

为了适应多样化的嵌入式利用和加快嵌入式系统的开拓历程,除了必要靠得住的根基平台软件的支持,如带有文件系统、收集协议栈的RTOS和配套的集成开拓情况,更紧张的是必要可以动态扩展的系统平台。近年来,新一代的嵌入式操作系统已经开始应用动态扩展技巧:将基础系统(包括操作系统以及其他共享功能调用库)和利用法度榜样开拓分开处置惩罚,支持模块更新和动态加载技巧。很多主流的传统嵌入式操作系统厂商,如windRiver、Green HilIs、Lynxworks,都推出了面向航空航天、根基通信设备等领域的高靠得住、高机能的RTOS版本,支持利用和系统组件的动态加载和更新;而在破费电子领域,相关的操作系统厂商,如symbian、Palm、Microsoft,更是积极推出了具有响应功能的操作系统,在新一代移动设备上获得了广泛利用。

为了成为可动态扩展系统平台,大年夜部分嵌入式操作系统必要应用动态加载技巧。总的来说,动态加载是指利用或者系统在运行历程中必要应用某模块的办事,于是经由过程一系列预定的动作将指定模块加载到系统中,让调用者继承顺利事情。它实现的关键便是加载与动态链接技巧。由于加载和动态链接相互依附,关系慎密,以是将两者放在一路进行评论争论。

1 加载与动态链接机制

加载主要认真将模块法度榜样从二级存储设备(比如硬盘或者Flash)搬移到指定内存空间,并且将模块交由系统加载器统一治理。

法度榜样链接分为静态链接、加载时链接和运行时链接。静态链接便是将法度榜样和它运行所需的整个库链接成一个履行文件。它的优点是可以自力运行、速率快,然则它链接天生的代码尺寸对照大年夜。加载时链接是指法度榜样在编译链接时不会把它用到的库链接到履行法度榜样中,而是在它被加载器加载时才解析履行文件,依次把用到的库装载到系统中让其运行。它的优点是法度榜样本身代码量减小,但运行时法度榜样占的内存并没有减小,同时增添了加载器的事情量。动态链接是加载时链接的进一步成长,它是指将库的加载历程延迟到法度榜样运行时履行。这种要领不会给法度榜样引入额外的代码,也不会增添加载器的开销,只有当利用真正应用某库时才会加载该库,削减了不需要的空间占用。它的毛病是可能会有一些运行开销。

嵌入式系统中动态加载和通俗的动态链接观点类似,然则嵌入式系统中的加载链接器有其自身的特征:它是交叉加载,主机端做一部分事情,比如法度榜样的重定位,履行文件的解析等等;而目标机审察对简单,主要做模块搜索定位和空间分配,以及指定物理地址或者映射虚拟地址让其运行。一部分嵌入式系统不支持虚拟内存,利用和内核共享存储空间。当系统加载了多个利用到系统中时,一样平常必要应用overlap技巧来办理内存空间有限的问题,等于当多个利用的运行地址空间冲突时,加载器会冻结当前暂时不运行的利用,让新加载的利用应用指定的地址空间,PairnOS中就采纳了这样的设计。对付支持虚拟内存的嵌入式系统,加载器的事情被大年夜大年夜简化,每个利用都有可以运行在同样的虚拟的空间,不必要加载器为其重定位或应用overlap技巧,是以前进了事情效率。Vxworks6.O,WinCE都应用了这种设计。两种要领在不合的领域都有对照多的利用。

2.2 模块的声明

模块首先要定义它的相关属性。这里应用模块声明文件来完成这个事情。模块声明文件中必要定义:模块名字、版本、对外供给的API接口。在系统编译模块法度榜样后,会调用一系列的script代码。这些script会根据模块名字查找模块对应的模块声明文件,并根据该文件天生供模块调用者应用的调用库和与模块一路链接的附加库。

附加库包孕系统后台经由过程调用script天生的接口函数地址表和模块注册函数。在每个模块的初始化函数中,会调用一个模块的注册函数(该函数主要事情是向系统注册模块的名字和接口函数地址表地址)。当模块被加载时,初始化函数会被系统调用,向系统注册模块信息,此后模块交由加载器统一治理。

2.3 调用库

每个模块在供给一个模块重定位表的同时,必须供给一个与之对应的模块调用库。其余目标法度榜样必须并且只能经由过程调用库来应用这个模块供给的办事。每个调用库都有一个存储本模块重定位表的地址指针变量。该变量在模块被目标法度榜样第一次应用时会被初始化为响应模块重定位表地址。

在模块第一次被目标法度榜样应用即开始动态加载历程时,首先运行的是调用库的库初始化代码(Library initialcode),它经由过程指定的系统调用来初始化库中的模块重定位表基地址指针。此后每次目标法度榜样应用模块供给的函数接口时,都经由过程以下公式获得该接口的实际地址:模块接口实际地址=模块重定位表基地址+函数index×4

在该公式中,函数index是指对应函数在模块重定位表中的数组下标值。由于根据模块声明文件天生的调用库中已经包孕了每个函数的索引信息(index),同时在32位系统中必要乘以4获得准确的偏移量,以是当调用库中重定位表地址被初始化后,可以经由过程这样一个简单谋略获得指定接口实际地址,完成函数调用。

您可能还会对下面的文章感兴趣: