c - 关于 Spectre 示例,虚拟/物理地址如何工作?

标签 c pointers virtual-address-space

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

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

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

00007FF6CF2210F0

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

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

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

那么问题是:

在 C 代码中,您将如何计算指针的物理地址?

最佳答案

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

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

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

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

关于c - 关于 Spectre 示例,虚拟/物理地址如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48189240/

相关文章:

c - 返回地址和返回指针的区别

c - 修剪 char * 中的前 n 个字符并释放它

linux-kernel - copy_to_user 在 s390 上如何工作?

c++ - 虚拟内存和核心转储之间的关系

c - 使用 valgrind 修复内存泄漏

c - 为什么我们需要使用双指针来访问二维数组?

c - 线性搜索与 strlen

c - 函数调用后指针未指向正确的数组元素

windows - 从性能的角度来看,虚拟地址空间映射如何才能被接受?

在 gdb 中查找环境变量地址时的奇怪事情