c - 是否可以通过指针销毁 memory ?

首先我 promise 我不会对此做任何坏事。我只是好奇。

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char ** argv) {
    int* p;
    while (true) {
        *p = 0;
        p++;
    }
    
    return 0;
}

回答1

大多数现代操作系统都在保护模式下运行。这意味着当您运行应用程序时,操作系统正在为您的应用程序创建一个虚拟 memory 空间。当 memory 分配命令(例如 malloc())尝试分配 memory 时,操作系统会拦截该命令并在应用程序首次运行时创建的虚拟 memory 空间中分配 memory,然后返回你是一个指向虚拟空间中的 memory 的指针。该指针是您应用程序自己的虚拟空间中的指针,不能访问其他进程的memory或系统进程的memory。

在保护模式下,有四个特权级别或环,编号从 0 到 3,其中环 0 是最高特权,而 3 是最低特权。环的使用允许系统软件限制任务访问数据、调用门或执行特权指令。

唯一的例外是您正在编写设备驱动程序。因为设备驱动程序直接与硬件接口,设备驱动程序通常在环 0 中运行,并被允许访问系统 memory 区域,否则常规进程将无法访问这些区域。

现在,如果您要在使用非保护模式(称为实模式)的操作系统中运行程序,例如 DOS 或 Windows 286,那么它会使您的计算机崩溃。它不会“破坏”memory,但会使它崩溃,您很可能会被迫关闭计算机并重新打开电源。

回答2

通常,没有。如果您在现代操作系统中运行它。在这种情况下,它既不能直接访问计算机 RAM,也不能不受限制地访问它自己的 memory 空间。

一个进程的 memory 空间是虚拟的,这意味着它不知道它的真实 RAM 地址,并且它无法访问其他进程的 memory,至少在不使用一些神秘的系统 API 的情况下是这样。多个进程可以共存写入相同的虚拟地址而不会发生冲突,而且它们通常会这样做。

最重要的是,更现代的操作系统支持称为控制流完整性的东西,它基本上对程序虚拟 memory 中的不同 memory 空间实施访问限制,以防止一些常见的攻击。例如,一个程序不能覆盖它自己的代码,也不能执行任何 memory 空间中没有明确标记该权限的代码。

相似文章

c++ - 如何正确使用 c++ 中的函数?

我正在尝试创建一个程序,该程序将为一堆消息框生成随机数,然后是蓝屏。主要问题是我不知道如何正确使用函数,所以我的程序无法运行。此外,WinEventProc有一个错误说,“块范围函数可能只有外部存储类...

随机推荐

最新文章