欢迎任何建议/讨论!
这个问题实际上很简短,但我会解释为什么我需要实际地址。
背景:
这些天我对缓存和多核架构着迷,现在我很好奇缓存在并行环境下如何影响我们的程序。
在某些 CPU 型号(例如,我的 Intel Core Duo T5800)中,L2 缓存在内核之间共享。因此,如果程序 A 正在访问物理地址的内存,例如
0x00000000, 0x20000000, 0x40000000...
和程序 B 访问数据
0x10000000, 0x30000000, 0x50000000...
由于这些地址共享相同的后缀,因此二级缓存中的相关集合会被频繁刷新。我们预计会看到两个程序相互竞争,从内存而不是缓存中缓慢读取数据,尽管它们在不同的内核中是分开的。
然后我想在实践中验证结果。在这个实验中,我必须知道物理地址而不是虚拟地址。但是我该如何应对呢?
第一次尝试:
从堆中吃掉一大块空间,掩码,得到某个地址。
我的 CPU 有一个大小为 2048KB 且关联性为 8 的 L2 缓存,因此物理地址之类0x12340000, 0x12380000, 0x123c0000
的将与 L2 缓存中的第一组相关。
int HEAP[200000000]={0};
int *v[2];
int main(int argc, char **argv) {
v[0] = (int*)(((unsigned)(HEAP)+0x3fffc) & 0xfffc0000);
v[1] = (int*) ((unsigned)(v[0]) + 0x40000);
// one program pollute v[0], another polluting v[1]
}
可悲的是,在虚拟内存的“帮助”下,变量HEAP
在物理内存中并不总是连续的。v[0]
并且v[1]
可能与不同的缓存集有关。
第二次尝试
access /proc/self/mem
,并尝试获取内存信息。
嗯……看来结果还是关于虚拟内存的。