hor*_*rro 0 c linux memory heap-memory
出于某种原因,我需要知道某个变量的物理地址.尽管如此,物理地址在初始化变量后会发生变化.要获取物理地址,我使用此函数(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));
Run Code Online (Sandbox Code Playgroud)
我正在编译-O2,但我也使用过-O0没有改变,所以我猜这种行为不是优化.我也在Arch Linux中使用内核4.13.4-1执行此代码.
这可能是一个愚蠢的问题,但我无法理解这种行为背后的原因.
除非锁定内存(mlock(2)),否则物理地址可能会随时间而变化.
如果您的变量未初始化,它将驻留在BSS中,并且BSS页面最初将指向填充零的共享页面.一旦您写入该页面,整个页面可能必须被复制到另一个页面框架(物理页面),因此不同的物理地址.
请注意,复制后页面中的相对偏移量保持不变:0x780正如从正确的代码中所预期的那样.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |