gpt4 book ai didi

c - 初始化变量时物理地址发生变化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:59 25 4
gpt4 key购买 nike

出于某种原因,我需要知道某个变量的物理地址。尽管如此,物理地址在初始化变量后会发生变化。要获取物理地址,我使用 this function (virt_to_phys(..., uint64_t virtaddr)) ,这似乎工作正常。一些行为示例:

初始化前: 虚拟 0x5632692a3780 物理 0x32b2c7c780

初始化后: 虚拟 0x5632692a3780 物理 0x342147a780

使用这些格式化程序:

printf("virtual 0x%llx physical 0x%llx\n", &p, virt_to_phys((uint64_t) &p));

我正在使用 -O2 进行编译,但我也使用了 -O0 并且没有任何变化,所以我猜想这种行为不是优化。我也在 Arch Linux 中使用内核 4.13.4-1 执行此代码。

这可能是个愚蠢的问题,但我不明白这种行为背后的原因。

最佳答案

除非您锁定内存 (mlock(2)),否则物理地址会随时间变化。

如果您的变量未初始化,它将驻留在 BSS 中,并且 BSS 页面最初将指向一个用零填充的共享页面。一旦您写入该页面,整个页面可能必须复制到另一个页面框架(物理页面),因此需要不同的物理地址。

请注意,复制后页面内的相对偏移量保持不变:0x780,正如正确代码所预期的那样。

关于c - 初始化变量时物理地址发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48260192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com