rt-thread平台 动态装载实现原理
原理分析:
a、在链接脚本link.lds里定义了专门存放动态符号表的段RTMSymTab。
b、内核对外提供可延时绑定的接口在rtm.h中通过RTM_EXPORT将一对对符号+地址构成的表存放到RTMSymTab段
#define RTM_EXPORT(symbol) \
const char __rtmsym_##symbol##_name[] SECTION(".rodata.name") = #symbol; ==》 __wrap_"#symbol \
const struct rt_module_symtab __rtmsym_##symbol SECTION("RTMSymTab")= \
{ \
(void *)&symbol, \
__rtmsym_##symbol##_name \
};
c、方案对比:
(rt-thread原生方案)、编译的时候通过scons --target=ua -s,内核将有延时绑定的接口头文件路径运行放在rtua.py中, app使用的bsp目录下带M_前缀的编译选项。根据编译脚本的配置,都将保存在elf文件中。
缺点1:因为其不能区分哪些接口使用内核的,哪些使用C库的,应用调用的posix接口全部来自内核,这需要内核封装很多C库的接口。也就是C库成为了内核的一部分。
缺点2:不支持连接第三个动态库。
(改进方案)、scons --export生成kernel_export_conf文件,app执行make的时候会将-wrap过的符号自动加上前缀_wrap_
1、通过wrap解决缺点1,使用wrap修饰的接口使用内核,否则使用C库。
2、通过完善dlmoudle模块,支持动态自动查找。
3、通过-shared,将未找到的符号,置0,ndx为UND,其实及时标记延时绑定(elf相关,readelf工具)。
4、通过–e main解决app的入口不一定是main问题。
d、运行的时候dlmodule_load先读取并解析elf文件,将其中需要重定位符号表的重新赋值绑定。
e、创建线程,运行app。
总体说来是:内核通过wrap技术将动态模块中的未定义的符号进行包装,对外导出(export),然后动态模块利用GCC的-shared -fPIC属性生成包含未定义符号的动态库(elf文件),最后在内核中加载动态库并使用elf文件解析器,解析elf文件并将未定义的符号使用内核的导出符号进行重定位。
rt-thread平台 动态装载实现原理的更多相关文章
- 通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载
前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的S ...
- Java虚拟机类装载的原理及实现(转)
Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态 ...
- Java 动态调试技术原理及实践
本文转载自Java 动态调试技术原理及实践 导语 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径.但断点调试会在断点位置停顿,使得整个应用停止响应. ...
- (转)android平台phonegap框架实现原理
(原文)http://blog.csdn.net/wuruixn/article/details/7405175 android平台phonegap框架实现原理 分类: Android2012-03- ...
- java高级---->Java动态代理的原理
Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...
- 反射那些事儿——Java动态装载和反射技术
一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...
- JIT动态编译器的原理与实现之Interpreter3
JIT动态编译器的原理与实现之Interpreter(解释器)的实现(三) 接下来,就是要实现一个虚拟机了.记得编码高质量的代码中有一条:不要过早地优化你的代码.所以,也本着循序渐进的原则,我将从实现 ...
- (转)Unity3D移动平台动态读取外部文件全解析
Unity3D移动平台动态读取外部文件全解析 c#语言规范 阅读目录 前言: 假如我想在editor里动态读取文件 移动平台的资源路径问题 移动平台读取外部文件的方法 补充: 回到目录 前言: 一直有 ...
- Cglib动态代理实现原理
Cglib动态代理实现方式 我们先通过一个demo看一下Cglib是如何实现动态代理的. 首先定义个服务类,有两个方法并且其中一个方法用final来修饰. public class PersonSer ...
随机推荐
- 运动控制之一_PID控制理论
PID算法是早期发展起来的控制算法,该算法因其简单.鲁棒性强且可靠性高而被广泛地应用于过程控制和运动控制中. 常规的PID控制系统原理框图如下所示: PID控制系统原理图 误差信号Err(t)输入到控 ...
- 解决 c3p0报错 Establishing SSL connection without server's identity verification is not recommended
_ 报错: Establishing SSL connection without server's identity verification is not recommended. Accordi ...
- tomcat配置去掉项目名称
在web项目中,把代码部署到服务器上访问时都不带项目名,可以配置tomcat 在tomcat安装目录下,找到conf/server.xml打开 <Host name="localhos ...
- Vue小技巧-懒加载
Vue懒加载包括图片懒加载与路由懒加载 1.图片懒加载: 首先安装 vue-lazyload包 然后导入并加载事先下载好的加载图片 import VueLazyLoad from 'vue-lazyl ...
- light sdk
//请求ajax var request = function (url,method,params,cb) { var d = ajax({ url:url, type:method, data:p ...
- 前端跨域(二):JSONP
上一篇文章 前端跨域(一):CORS 实现了跨域的一种解决方案,IE8 和其他浏览器分别通过 XDomainRequest 和 XHR 对象原生支持 CORS.这次我将补一补 Web 服务中也非常流行 ...
- 《HTTP权威指南》读书笔记(二) :URL与资源
1.URL是什么 URL就是因特网资源的标准化名称.URL指向一条电子信息片段,告诉你它们位于何处,以及如何与之交互.通俗来说,就是浏览器寻找信息所需的资源位置. URI是一类更通用的资源标识符,UR ...
- 连接mysql用mysql_connect不能连接
用mysqli_connect就可以解决. mysqli_array()有连个参数,第一个是连接mysql名. php遇到这个警告Warning: Use of undefined constant ...
- hbuilder中的wap2app (将M站快速转换成App的开发框架)使用过程有关原生标题的关闭
首先,我最近在做有关将M站快速转换成App的项目,在网上看了很多,最终结合同学的推荐,我选择了hbuilder,有关于hbuilder的下载还有具体使用方法,官网都有详细的说明,我就不介绍了,我重点介 ...
- sklearn中的朴素贝叶斯模型及其应用
1.(1)多项式 from sklearn.datasets import load_iris iris = load_iris() from sklearn.naive_bayes import G ...