2019独角兽企业重金招聘Python工程师标准>>>

1. 跳转表存在的意义

1.1 内核模块反汇编

如下的程序清单,为一个内核模块的源码。

#define  __SYLIXOS_KERNEL
#include <SylixOS.h>
#include <module.h>/**  SylixOS call module_init() and module_exit() automatically.*/
int module_init (void)
{printk("hello_module init!\n");return 0;
}void module_exit (void)
{
}

反汇编之后的内容如下所示。

kmTest.ko:     file format elf64-littleaarch64
Disassembly of section .text:
0000000000000000 <module_init>:
/**  SylixOS call module_init() and module_exit() automatically.*/
int module_init (void)
{0: a9bf7bfd    stp x29, x30, [sp, #-16]!4: 910003fd    mov x29, spprintk("hello_module init!\n");8:  90000000    adrp    x0, 0 <module_init>c: 91000000    add x0, x0, #0x010: f9400000    ldr x0, [x0]14: 94000000    bl  0 <API_LogPrintk>return 0;18: 52800000    mov w0, #0x0                    // #0
}1c:    a8c17bfd    ldp x29, x30, [sp], #1620:  d65f03c0    ret24:  d503201f    nop...
0000000000000030 <module_exit>:
void module_exit (void)
{
}30:    d503201f    nop34:  d65f03c0    ret

从以上反汇编结果可知,printk函数调用会被汇编为BL指令,并且跳转的目的地址为0,这是因为实际的跳转地址会在动态加载时进行调整。

94000000    bl  0 <API_LogPrintk>

1.2 BL指令分析

查阅ARMv8手册,BL指令的结构如下图所示。 按照该结构可知,BL指令最大的跳转范围为4×226 = 256MB,即±128MB。但是“实际需跳转位置”与“当前指令位置”的地址偏移很有可能超过该范围。所以在动态加载时,需要修改这条指令的实现,使得其具有跳转到整个64位地址空间的能力。

2. AARCH64跳转表实现

2.1 利用跳转表进行跳转

通常的做法是采用跳转表进行实现。 跳转表使用的方式如下图所示,其中“跳转表所在的位置”与“当前指令位置”的地址偏移范围为±128MB之内,因此,可以首先从当前位置跳转到跳转表中的某一个表项。

2.2 BR跳转指令

BR跳转指令使用寄存器进行跳转,那么该指令具体264地址空间跳转的能力,因此跳转表可以借助该指令进行实现。

2.3 跳转表结构

|字节 |指令内容| |--|--| |[16:19] |movn x16, #0x….| |[12:15] | movk x16, #0x…., lsl #16 | |[08:11] | movk x16, #0x…., lsl #32 | |[04:07] | movk x16, #0x…., lsl #48 | |[00:03] | br x16 | 因为MOV指令不能一次将一个64位数移入寄存器,所以必须将移位操作分为四步完成,如上表所示。 此时,在动态加载时,按照如下方式进行跳转:

1、 将原来的BL指令中目的跳转位置,调整为跳转表对应表项的位置;

2、 跳转表会将实际跳转地址更新到X16寄存器中;

3、 通过BR指令跳转到实际的目标地址。

转载于:https://my.oschina.net/wPCBsKzQ/blog/2251381

SylixOS中AARCH64跳转表实现原理相关推荐

  1. Java form表单原理,动态表单及动态建表实现原理[Java编程]

    赞助商链接 本文"动态表单及动态建表实现原理[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下 ...

  2. 游戏排行榜-跳表实现原理分析

    前言 做游戏的一般都有游戏排行榜的需求,要查一下某个uid的积分排名第几,这里我给大家推荐之前我们使用的一种排序算法,跳表skiplist. 跳表是一个随机化的数据结构.它允许快速查询一个有序连续元素 ...

  3. MySQL中如何通过修改表实现约束的添加与删除

    修改表实现约束的添加与删除 一.主键约束 添加主键约束 Alter table 表名 add primary key(列名) 例 将 emp 表中的 employee_id 修改为主键且自动增长: ...

  4. 动态表单及动态建表实现原理

    1 应用场景   项目中往往需要动态的创建一个表单,或者添加一个新的数据模板,这时候因为需要在运行时动态的创建表以及动态的维护表字段甚至表关系 使得普通java解决方案变得困难重重. 2 实现工具 H ...

  5. redis跳跃表实现原理

    跳跃表是一种可以对有序链表进行近似二分查找的数据结构,redis在两个地方用到了跳跃表,一个是实现有序集合,另一个是在集群节点中用作内部数据结构.  跳跃表(skiplist)是一种有序数据结构,它通 ...

  6. 使用事务代码MB51+Excel中的数据透视表实现 收发存报表

    业务需求说明: 国内大部分公司,对于仓库管理习惯使用如下的收发存报表,该报表在大部分项目中通过开发进行实现. 收发存报表示例: 物料 月份 采购入库数量(金额) 生产入库数量(金额) 生产发料数量(金 ...

  7. 子窗体中组合框联动_一张表实现组合框联动

    嗨,大家中午好! 最近,有网友给我私信,想要一个联动的示例,一个有关于部门联动的操作. 其实关于联动的操作有很多,可以是组合框的联动,列表框联动,组合框与列表框也可以联动,哪怕是放到子窗体中也是可以联 ...

  8. 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )

    文章目录 一.通过修改 GOT 全局偏移表拦截函数 二.通过在实际被调用的函数中添加跳转代码实现函数拦截 一.通过修改 GOT 全局偏移表拦截函数 使用 GOT 全局偏移表 拦截函数 , 只需要将 G ...

  9. SylixOS中select原理及使用分析

    2019独角兽企业重金招聘Python工程师标准>>> 1. select接口简介 1.1 select接口使用用例 select是操作系统多路I/O复用技术实现的方式之一. 多路I ...

最新文章

  1. 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
  2. LeetCode 1814. 统计一个数组中好对子的数目(哈希)
  3. trang.jar转换xml到Javabean
  4. 苹果终于迷途知返?还是指纹识别更香...
  5. Algorithm Data structure
  6. faster rcnn论文_论文导读-从Faster-RCNN/Mask RCNN/Cascade-RCNN到HTC
  7. Python语言三种优点。
  8. win10无法执行vbs脚本
  9. cloudflare_CloudFlare泄漏的消息揭晓,密码管理变得轻松
  10. 联通专线切换成移动专线问题故障解决
  11. html表格复制最后一行字,为什么Word中的表格输入文字最后一行文字会自动跳到下一页...
  12. 失业一年,学做跨境电商赚了50万,才知道上班是真的耽误赚钱 !
  13. c lua语言教程,Lua教程(三):C语言、C++中调用Lua的Table示例
  14. 什么是云服务器?什么是阿里云服务器管理?
  15. 暗月渗透实战靶场-项目六(上)
  16. AnySim一键解锁教程nbsp;只适用于新iPhone
  17. skywalking agent 导致内存泄漏的一些问题
  18. 为何热爱机器人工程专业的朋友如此少
  19. 测试/开发程序员幽默的 “自嘲“?印象流派......
  20. windows卸载夸克网盘没有卸载干净

热门文章

  1. 次数匹配(不需要在前面加“\”)
  2. 【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(下)
  3. 在线HTML转JS/JSON工具
  4. Halcon 基本算子释义
  5. 正则中关于环视(lookaround)的小例子
  6. 统计出每个班分别有男女生各多少名
  7. python basic programs
  8. ArcGIS For Flex学习之Mapping---Map Extent and Mouse Coordinates
  9. 关于Camel In Action 的理解
  10. 二分查找算法的C/C++实现