如果一个软件转到地址 0x1500 并在那里设置值 6,然后另一个软件转到同一地址并读取它,会读取 6,会发生什么?会一直这样吗?操作系统级别和处理器级别的机制是什么?
2 回答
这得看情况...
这取决于
- 处理器 (8051/x86/x386...)
- 处理器模式(真实/受保护)
- 操作系统(支持保护模式?)
- 进程模式(用户模式/内核模式)
- 地址类型(共享/私有)
- 地址访问权限(允许/拒绝)
现在这里有一些组合及其结果
----------------------------------------------------------------------
PROCESSOR MODE PROCESS MODE ADDRESS TYPE PRIVILEGE OUTCOME
======================================================================
Real Kernel -- -- r/w
Protected Kernel shared ok r/w
Protected user shared ok r/w
Protected user private -- r/w with diff result
Protected Kernel shared no error
Protected user shared no error
....
======================================================================
注意:在实模式下,您始终可以互相交谈。在保护模式下,这取决于。一些(旧)处理器不支持保护模式(8051/8086 等)。一些新处理器可能处于两种模式之一 - 真实或受保护。在保护模式下,如果操作系统允许,您可以交谈。如果没有,你会得到错误。保护模式可以是分页的或非分页的。分页模式支持私有地址(具有相同的值),非分页模式不支持。两个差异。进程可以在其私有地址中读取/写入相同的位置,但他们可以获得差异。价值观。
如您所见,这真的很复杂。
此外, 普通软件在受保护 + 用户模式 + 私有内存中工作。因此,两个 diff 软件都可以在地址 0x1500 处执行 r/w,但两者都有独立的值。该软件所写的就是它将读取的内容。
这在早期的操作系统(例如 Windows 95)中默认是可能的。这是非常有问题的。
Chips Challenge 是一款适用于 Windows 95 的游戏,其中有一个错误 - 如果您同时收集一个钥匙并在同一个瓷砖/步骤上死亡,它的逻辑就会出错,它会写入内存中的错误位置。由于每个程序共享相同的内存空间,它现在可能正在写入另一个程序正在使用的内存 - 导致其他程序崩溃并可能使操作系统不稳定并需要重新启动。
在现代操作系统中,每个程序现在都有自己的虚拟内存空间 - 每个程序认为内存的布局实际上是由 CPU 和操作系统共同生成的虚构,因此所有内存读取和写入,如果它们完成越界,被拦截和阻止,并且程序正在写入和读取的内存中的真实位置对于程序来说是未知的(这也允许内存从 RAM '分页'到硬盘上,然后再分页回下次检测到需要它时放在不同的地方)。