virtual/physical 地址在 Spectre 示例中如何工作?

How does virtual/physical addresses work in regards to the Spectre example?

我已经有几年没有编程了,但是由于对 Meltdown 和 Spectre 的大惊小怪,我安装了 VS2017 并从这个 pdf 编译了 Spectre 示例:https://spectreattack.com/spectre.pdf

但是我不知道 Spectre 示例在命令行上使用的地址是如何工作的?

我修改了代码以输出秘密字符串的指针地址,并在 Native Tools Shell 中用 cl 编译,它输出如下内容:

00007FF6CF2210F0

在示例的命令行中输入此地址,它会正确输出秘密字符串。

但是如果我用类似的字符串编写一个简单的程序并输出那个地址 然后将它提供给 Spectre 示例,在另一个 shell 中,我没有得到正确的字符串。

我一直在阅读有关虚拟地址与物理地址以及页面和偏移量的信息,但我完全迷失了。

所以问题是:

你会如何在 C 代码中计算指针的物理地址?

How would you in C code calculate the physical address of a pointer?

我带你去问关于计算由指针值表示的物理地址,而不是存储指针值的物理地址。无论如何,后者只是归结为前者。

但就C语言本身而言,你不要这样做。 C 从一开始就不承认物理内存和虚拟内存之间的区别,也没有必要这样做。这种区别是 OS 级别的硬件支持问题。因此,任何实现您所描述内容的技术都依赖于 C 实现和执行环境的细节。

Spectre 设法打破(部分)由虚拟内存提供的进程隔离可能是它最可怕的地方。