SylixOS动态加载器系列文章(7) ARM体系结构相关
2015-08-14 19:59
260 查看
SylixOS加载器目前主要运行于ARM平台,所以本系列文章最后介绍一下和ARM体系结构相关的处理。
typedef struct long_jmp_item {
ULONG ulJmpInstruction; /* 跳转指令 */
Elf_Addr addrJmpDest; /* 目标地址 */
} LONG_JMP_ITEM;
ulJmpInstruction字段全部被填写为0xE51FF004指令,其功能是跳转到PC+4内存中记录的地址值。而将真正的目标地址填写到addrJmpDest字段。
SylixOS官网:www.sylixos.com
SylixOS源码下载:git.sylixos.com
SylixOS百科:wiki.sylixos.com
cache处理
加载器对ELF文件的处理通过数据cache进程,而ELF文件在执行时cpu通过指令cache寻址。在数据cache和指令cache分开的体系结构中,会出现数据cache和指令cache不同步的情况。SylixOS在重定位工作完成后(这时意外着对ELF文件内存指令块的修改已经完成了)会手动调用系统的cache同步指定,同步内存块的数据catch,无效指令catch。长距离相对跳转
前面文章有说的当相对地址跳转的距离大于ARM能处理的最大值是,加载器将其转化为绝对地址调转。加载器生成跳转表,将相对地址调整的目标地址改为跳转表表项,跳转表表现定义如下:typedef struct long_jmp_item {
ULONG ulJmpInstruction; /* 跳转指令 */
Elf_Addr addrJmpDest; /* 目标地址 */
} LONG_JMP_ITEM;
ulJmpInstruction字段全部被填写为0xE51FF004指令,其功能是跳转到PC+4内存中记录的地址值。而将真正的目标地址填写到addrJmpDest字段。
arm指令集和thumb指令集相互调用
arm和thumb指令集的大部分交互都已经被抽象成重定位类型,无需加载器关系其细节。有一种特殊情况例外,当两份相互调用的arm指令源码和thumb指令源码分开编译时他们并不知道对方是什么指令集,所有跳转指令默认编译成BL,链接器根据需要再将其转为BLX。BLX是可以进行指令集切换的调整指令。那么问题来了,内核模块文件是不会进行链接步骤的,所以需要由加载器完成,加载器检测BL目标地址是否需要切换模式,如果需要则将其改为BLX。具体方法参考SylixOS源码。SylixOS官网:www.sylixos.com
SylixOS源码下载:git.sylixos.com
SylixOS百科:wiki.sylixos.com
相关文章推荐
- hdu 3074 Multiply game(线段树模板题) 解题报告
- codeforces 518D D. Ilya and Escalator(概率dp)
- Matlab中plot函数全功能解析
- 恶意程序敲诈者解析
- 欢迎使用CSDN-markdown编辑器
- Oracle开发中的正则表达式
- JPA学习笔记(7)——映射多对一关联关系
- Pixhawk飞控开发环境配置
- Datagrid添加右键菜单
- android版本获取
- 小白学开发(iOS)OC_ 基本数据类型的包装类(2015-08-14)
- visualsvn在win8下本地内网使用架设小记
- java正则表达式总结
- HDU 1098 Ignatius's puzzle(数学归纳法)
- 如何提高科研效率
- mysql登录和连接 权限
- 小白学开发(iOS)OC_ 常用结构体(2015-08-14)
- jeecms标签对应的类,方便查找标签的输入输出参数,以及参数对应的数值类型、范围
- poj 2367 Genealogical tree【拓朴排序模板题】
- 工作上的C/C++相关