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

 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值