首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__pv_stub(x,t,"add",__PV_BITS_31_24)...为什么__PV_BITS_31_24是0x8100_0000?

__pv_stub(x,t,"add",__PV_BITS_31_24)...为什么__PV_BITS_31_24是0x8100_0000?
EN

Stack Overflow用户
提问于 2016-07-19 18:53:16
回答 1查看 179关注 0票数 1

函数

代码语言:javascript
复制
__virt_to_phys(unsigned long x)

归根结底是

代码语言:javascript
复制
__pv_stub(x, t, "add", __PV_BITS_31_24);

__pv_stub宏将展开为

代码语言:javascript
复制
add  t, x, 0x8100_0000

除了在.pv_table部分中插入指向此指令的指针外,它还可用于在启动期间修补此add指令。我的问题是关于常量__PV_BITS_31_24。是否有任何理由对其使用值0x8100_0000。

根据我的理解,这个值使得add指令的12位立即数编码字段为481十六进制。在运行时,在启动函数期间,__fix_pv_table将其更改为4C0十六进制(假设第一个内存库在0x8000_0000处开始)。值0x8100_0000是否如此普遍,以至于人们决定在编译期间使用它作为默认值,如果它不同,那么无论如何它都会在启动期间被修复?或者有什么不同的原因,我完全不能理解?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-19 19:51:12

简而言之,因为它设置了位31和24,因此产生了用于修补偏移量的MSB的适当指令编码。

请记住,ARM指令中的立即常数是由旋转到32位字中16个位置之一的8位值构成的。汇编初始值0x81000000可确保对位31:24进行适当的旋转编码,因此随后可以在指令的底部字节上写入任何其他8位值,而无需担心其余部分。

它同样可以是0xff000000 (或至少设置了24位和30位或31位的任何其他值),但显然是that particular value was was a relatively arbitrary decision by the maintainer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38456507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档