arm64 __calc_phys_offset

__calc_phys_offset

/*
 * Calculate the start of physical memory.
 */
__calc_phys_offset:
	adr	x0, 1f
	ldp	x1, x2, [x0]
	sub	x28, x0, x1			// x28 = PHYS_OFFSET - PAGE_OFFSET
	add	x24, x2, x28			// x24 = PHYS_OFFSET
	ret
ENDPROC(__calc_phys_offset)

	.align 3
1:	.quad	.
	.quad	PAGE_OFFSET

1.adr x0,1f     // ldr加载当前pc值加上当前物理地址到1标签处的偏移,假设当前PC为0x10000000(物理地址),此处代码的虚拟地址为0xc000a000,1f标签处的虚拟地址为0xc000a000a,那么此时adr指令执行后,x0的值为 0x10000000 + 0xa = 0x1000000a,即此时1f标签处的物理地址

2.ldp为位置无关的指令,执行 ldp x1,x2,[x0],将加载1标签处的值,x1 = . 即1标签处的虚拟地址,System.map中的地址,x2 = PAGE_OFFSET

x0 为标签1处的物理地址

x1 为标签1处的虚拟地址

因为线性映射中:va = pa - pa_offset + PAGE_OFFSET

所以有 x28 = x0 - x1 = pa -va = pa_offset - PAGE_OFFSET = pa_offset - x2

所以PA_OFFSET = x28 + x2,将此值赋给x24,

即x24为PHYS_OFFSET 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科技之光666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值