Windows 10 是否保护您不访问其他程序正在使用的内存?
Does Windows 10 protect you from accessing memory that another program is using?
以下C++代码有效:
int *p = new int;
p[1000] = 12;
这意味着我访问的内存位置距离 p 的大小 (int) * 1000 字节。
我在想的是,也许 Windows 或任何其他程序当前正在使用内存位置 &p[1000] 来做某事。如果我厌倦了将 p[1000] 设置为新值,那么另一个程序甚至可能使用该位置来保存一些内存的 Windows 可能会崩溃,因为我更改了该程序的重要变量。
由于C++并没有禁止这样做,我想知道至少 Windows 是否对使用其他人当前使用的内存位置的程序具有某种保护。
在 Windows(和所有其他现代消费者操作系统)上,写入不属于您的内存地址不会直接影响属于任何其他进程的内存。
但是,操作系统可能正在使用该内存为您的程序提供基本服务,或者该地址可能根本不有效,因此覆盖您不拥有的地址可能会导致您的程序崩溃或以意外方式运行,无论是立即还是在将来的某个不可预测的时刻。 谷歌"未定义的行为",以进一步讨论为什么这是一件坏事。
就Windows而言,我模糊地记得GUI使用一些用户模式的共享内存(为了提高效率),所以如果你真的很不幸,那么写入错误的地址可能会导致其他GUI程序出现故障,甚至整个GUI变得无响应,从用户的角度来看,这看起来非常类似于操作系统挂起。 不过,我认为我从未见过这种情况发生,所以也许我的信息已经过时,或者有适当的保护机制来降低这种情况的可能性。 (这并不代表安全漏洞,因为它只影响用户的其他程序,并且恶意程序可以通过任何其他更可靠的方式达到相同的效果。
内存被组织成 PAGES。每个进程都会看到一个逻辑地址空间,该空间由编号为 0-N 的页组成。
逻辑地址空间分为两个范围:用户空间和系统空间。
每个进程都有自己唯一的用户空间,所有进程共享相同的系统空间。您的用户空间页面 10 映射到不同的物理位置,然后映射到其他进程的用户空间页面 10(在大多数情况下)。
系统空间中的内存受到保护,无法访问用户模式。写入它的唯一方法是切换到内核模式。操作系统将执行此操作的方式限制为对特定系统服务的调用。因此,如果没有错误(但我们在这里谈论的是 M$),您应该无法随意修改系统空间。
两个应用程序可以映射内存,以便它们在用户模式下共享内存位置。在这种情况下,你可以把事情搞砸,做你正在说明的事情。但是,您必须在两个进程中显式映射内存。
每个进程都有自己的地址空间。这个空间映射到真正的地址。它们不重叠。
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 内存清理程序报告全局对象构造中未初始化值的使用
- 多线程程序中出现意外的内存泄漏
- C++ 程序不会因为内存而终止
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 应用程序内存使用量减少
- 当注入程序的内存空间时,如何读取从 0 到 0xFFFFFFFFF 的每个字节?我正在创建模式扫描仪
- 如何运行外部程序,向其传递内存地址以读取/写入?
- 在C++应用程序中使用 Tensorflow:如何释放 GPU 内存
- C++程序错误:malloc():内存损坏
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- OpenGL GLFW 应用程序 - 客户端内存限制
- 我们如何在ESP8266上减小程序内存上的代码大小
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 正在从程序内存中分解x指令
- 随着时间的推移,我的程序越来越慢,我不知道为什么.内存泄漏
- 开发C++在运行大内存程序时崩溃
- 动态内存c++程序中的字符串错误
- 在linux上编写的一个简单的c++共享内存程序:分段错误