【问题标题】:Why do we need memory protection when we have virtual memory?为什么我们有虚拟内存时需要内存保护?
【发布时间】:2022-08-16 21:40:12
【问题描述】:

通过内存保护,我的意思是以下程序将在许多机器上抛出运行时异常:

#include <iostream>

int main() {
    int* my_int = new int[12];
    std::cout << my_int[20000];
    delete(my_int);
    return 0;
}

该程序给出以下错误:

Exception thrown at 0x00007FF7A467101A in myprogram.exe: 0xC0000005: Access violation reading location 0x000002794CA635C0.

因为每个进程都有自己的虚拟内存,所以我的代码中已经保护了其他程序免受访问冲突的影响。在我看来,正确的程序会付出运行时成本,因为错误的程序可能会访问未分配的内存。

为什么计算机会在调试模式之外为防止访问违规而烦恼?

  • 即使使用虚拟内存地址,地址也必须由操作系统管理的物理内存支持。因此,必须显式分配内存,以便操作系统可以为您的特定进程保留它(或将其关联到)。
  • 当您遇到访问错误(包括越界错误)时,这意味着您的程序存在逻辑错误或已进入未定义行为。当你的程序处于这种状态时,它是不可靠的,通常最好阻止它做任何其他事情。
  • 考虑虚拟内存如何映射虚拟地址。如果my_int + 20000; 生成的地址没有映射到此过程的任何内容,您期望什么结果?取消引用指针没有可以读取的有意义的值,甚至没有可以读取的未初始化内存。
  • 甚至虚拟内存也是有限的资源,并且可以用完所有虚拟内存地址空间而不会耗尽物理内存(按需加载页面)。所以操作系统喜欢知道每个程序可以访问多少虚拟地址空间。
  • @MarkWallace 分段错误是特定于平台的错误状态,它是具有未定义行为的代码的可能结果。它发生的时间和地点取决于您的平台。

标签: c++ memory-management allocation access-violation virtual-memory


【解决方案1】:

我建议您总体上了解更多关于pagingvirtual memoryMemory management 的信息。 MMU 在 page walk 期间,CPU 将意识到正在访问的虚拟内存未映射。具体抛出的异常是系统相关的。

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 2015-10-24
    • 2020-05-20
    • 2019-06-26
    • 2021-04-28
    • 2011-11-27
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多