函数
__virt_to_phys(unsigned long x)归根结底是
__pv_stub(x, t, "add", __PV_BITS_31_24);__pv_stub宏将展开为
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是否如此普遍,以至于人们决定在编译期间使用它作为默认值,如果它不同,那么无论如何它都会在启动期间被修复?或者有什么不同的原因,我完全不能理解?
发布于 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。
https://stackoverflow.com/questions/38456507
复制相似问题