繁体   English   中英

初始化变量时物理地址会有所不同

[英]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 ,这是正确代码所期望的。

我要说的第一件事是打印指针 (地址):

  • 使用%p格式说明符。
  • 将相应的参数强制转换为(void *)

否则,您将导致未定义的行为,并且无论如何都无法证明输出的合理性。

就是说,正如@Anti另一个答案中提到的,此处“备份”虚拟内存的物理内存不需要固定。 基于实现,基于分配内存的类型的类型(行为),可以导致物理内存在后台更改。 因此,我们在应用程序代码中使用虚拟内存,并让OS / MMU在后台处理映射和转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM