SylixOS中AARCH64跳转表实现原理

1. 跳转表存在的意义

1.1 内核模块反汇编

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

#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, sp
    printk("hello_module init!\n");
   8:	90000000 	adrp	x0, 0 <module_init>
   c:	91000000 	add	x0, x0, #0x0
  10:	f9400000 	ldr	x0, [x0]
  14:	94000000 	bl	0 <API_LogPrintk>
    return 0;
  18:	52800000 	mov	w0, #0x0                   	// #0
}
  1c:	a8c17bfd 	ldp	x29, x30, [sp], #16
  20:	d65f03c0 	ret
  24:	d503201f 	nop
	...
0000000000000030 <module_exit>:
void module_exit (void)
{
}
  30:	d503201f 	nop
  34:	d65f03c0 	ret

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

94000000 	bl	0 <API_LogPrintk>

1.2 BL指令分析

查阅ARMv8手册,BL指令的结构如下图所示。
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指令跳转到实际的目标地址。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值