[英]Physical address varies when initializing variable
由于某些原因,我需要知道某个变量的物理地址。 但是,物理地址在初始化变量后会更改。 为了获得物理地址,我使用了此功能( virt_to_phys(..., uint64_t virtaddr)
) ,该功能似乎正常工作。 该行为的一些示例:
初始化之前: virtual 0x5632692a3780 physical 0x32b2c7c780
初始化后: virtual 0x5632692a3780 physical 0x342147a780
使用这些格式化程序:
printf("virtual 0x%llx physical 0x%llx\n", &p, virt_to_phys((uint64_t) &p));
我正在使用-O2
编译,但是我也使用了-O0
并且没有任何变化,因此我猜这种行为不是一种优化。 我也在带有内核4.13.4-1的Arch Linux中执行此代码。
这可能是一个愚蠢的问题,但我无法理解这种行为背后的原因。
除非您锁定内存 ( mlock(2)
),否则物理地址可能会随时间变化。
如果您的变量未初始化,它将驻留在BSS中,并且BSS页面最初将指向填充有零的共享页面 。 写入该页面后,可能必须将整个页面复制到另一个页面框架(物理页面),因此要复制到另一个物理地址。
请注意,复制后页面内的相对偏移保持不变: 0x780
,这是正确代码所期望的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.