Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 10是否保护您不访问其他程序正在使用的内存? 下面的C++代码工作: int *p = new int; p[1000] = 12;_C++_Windows_Memory_Memory Management_Shared Memory - Fatal编程技术网

Windows 10是否保护您不访问其他程序正在使用的内存? 下面的C++代码工作: int *p = new int; p[1000] = 12;

Windows 10是否保护您不访问其他程序正在使用的内存? 下面的C++代码工作: int *p = new int; p[1000] = 12;,c++,windows,memory,memory-management,shared-memory,C++,Windows,Memory,Memory Management,Shared Memory,这意味着我访问的内存位置距离p的大小为sizeof(int)*1000字节 我当时想的是,可能Windows或任何其他程序目前正在使用内存位置&p[1000]来进行某些操作。如果我试图将p[1000]设置为一个新值,那么另一个程序,甚至可能是使用该位置来保存内存的Windows,可能会崩溃,因为我更改了该程序的一个重要变量 因为C++不禁止这个,我想知道Windows是否至少有一个保护程序,它使用的是当前使用的内存位置。p> 每个进程都有自己的地址空间。这个空间被映射到真实地址。它们不重叠。内存

这意味着我访问的内存位置距离p的大小为sizeof(int)*1000字节

我当时想的是,可能Windows或任何其他程序目前正在使用内存位置&p[1000]来进行某些操作。如果我试图将p[1000]设置为一个新值,那么另一个程序,甚至可能是使用该位置来保存内存的Windows,可能会崩溃,因为我更改了该程序的一个重要变量


因为C++不禁止这个,我想知道Windows是否至少有一个保护程序,它使用的是当前使用的内存位置。p> 每个进程都有自己的地址空间。这个空间被映射到真实地址。它们不重叠。

内存被组织成页面。每个进程都会看到一个由编号为0-N的页组成的逻辑地址空间

逻辑地址空间分为两个范围:用户空间和系统空间

每个进程都有自己独特的用户空间,所有进程共享相同的系统空间。您的用户空间第10页映射到不同的物理位置,然后映射到其他进程的用户空间第10页(在大多数情况下)

系统空间中的内存受保护,不受用户模式访问。写入它的唯一方法是切换到内核模式。操作系统将如何执行此操作限制为对特定系统服务的调用。因此,如果没有bug(但我们这里说的是M$),您不应该随意修改系统空间

两个应用程序可以以这样的方式映射内存,即它们在用户模式下共享内存位置。在这种情况下,你可以把事情搞砸,做你正在演示的事情。但是,您必须在两个进程中显式映射内存。

在Windows(以及所有其他现代消费类操作系统)上,写入您不拥有的内存地址不会直接影响属于任何其他进程的内存

但是,操作系统可能正在使用该内存为您的程序提供基本服务,或者该地址可能根本无效,因此覆盖您不拥有的地址可能会导致您的程序崩溃或以意外方式运行,无论是立即还是在将来的某个不可预知的时刻。谷歌“未定义的行为”,更多的讨论为什么这是一件坏事


在Windows的情况下,我模糊地记得GUI使用了一些用户模式共享内存(为了提高效率),因此如果你真的不走运,那么写入错误的地址可能会导致其他GUI程序出现故障,甚至整个GUI变得无响应,从用户的角度来看,这与操作系统非常相似。不过,我认为我从未见过这种情况发生,所以可能我的信息已经过时,或者有保护机制使这种情况不太可能发生。(这并不表示存在安全漏洞,因为它只会影响用户的其他程序,恶意程序可能会以任何其他更可靠的方式实现相同的效果。)

它不“工作”,它表现出未定义的行为。由于它不是特定于Windows的,所以不确定是否存在重复:是否“至少是Windows”包括Windows 3.11及以前版本?进程内存保护由硬件管理,查找“MMU”这是受保护模式操作系统(如Windows)最基本的工作,以确保您永远不会弄乱另一个进程的地址空间。今天的操作系统之所以能如此工作,主要是因为C语言允许这样做。并非总是如此,但竞争性的方法并没有生存下来。