首先我 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 空间中没有明确标记该权限的代码。