您的位置:首页 > 其它

SylixOS动态加载器系列文章(7) ARM体系结构相关

2015-08-14 19:59 260 查看
SylixOS加载器目前主要运行于ARM平台,所以本系列文章最后介绍一下和ARM体系结构相关的处理。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: