![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
2.4 两级重定位表
在嵌入式领域,为了降低性能开销和增加确定性,目标机端加载器不会做程序重定位,而将相关工作在主机端完成,所以目标机端加载的所有程序都是绝对定位后的程序.为了实现系统动态扩展,必须使各个模块能够单独链接生成执行程序,并且运行时不用关心彼此的定位,这样即使一个模块被动态替换后也能同其他程序一起协调运行。这里通过两级重定位表机制来完成这个协调性的工作。
对于内核、操作系统组件模块或提供服务给其他目标程序使用的模块,要维护一张本模块提供的接口函数地址表(即模块重定位表,这里称之为二级重定位表)。为了保证本模块的向后兼容性,模块必须保证其接口函数在模块重定位表中的相对位置固定。即使今后不能提供这个接口函数,也需要将其保留,以保证同以前版本的二进制兼容性。
在模块的初始化代码中,模块通过系统调用向加载器注册这个模块重定位表的地址,注册时需提供模块名和模块重定位表的地址。加载器中治理着一个称为一级重定向表的表格。这个表的表项是“模块名”到“模块重定位表地址”的映射。因为这只是一个映射关系,所以各个模块对应的表项在一级表中的具体位置是可以改变的。 |
|