两个软件访问相同的内存地址

时间:2013-06-14 05:10:45

标签: memory memory-management

如果一个软件转到地址0x1500并在那里设置值6,然后另一个软件转到同一地址并读取它会发生什么情况,将读取6?会不会像那样?操作系统级别和处理器级别的机制是什么?

2 个答案:

答案 0 :(得分:2)

这取决于......

取决于

  1. 处理器(8051 / x86 / x386 ......)
  2. 处理器模式(真实/受保护)
  3. 操作系统(支持保护模式?)
  4. 处理模式(用户模式/内核模式)
  5. 地址类型(共享/私人)
  6. 地址访问权限(允许/拒绝)
  7. 现在这里有一些组合及其结果

    ----------------------------------------------------------------------
    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等)。一些新处理器可能处于两种模式之一 - 真实或受保护。在保护模式下,如果操作系统允许,您可以进行通话。如果没有,你会收到错误。保护模式可以是分页的或非分页的。分页模式支持私有地址(具有相同的值),非分页模式不支持。两个差异。进程可以在其私有地址中读/写相同的位置但它们可以获得差异。值。

    你可以看到,它真的很复杂。

    同时 普通软件在protected + usermode + private memory中工作。因此,两个diff软件都可以在地址0x1500处执行r / w,但两者都具有独立的值。该软件所写的是它将会阅读的内容。

答案 1 :(得分:1)

在早期的操作系统(例如Windows 95)中,默认情况下这是可能的。这是非常有问题的。

Chips Challenge是一款适用于Windows 95的游戏,它有一个错误 - 如果你同时收集了一个密钥而死在同一个磁贴/步骤上,它的逻辑会出错并且会写入内存中的错误位置。由于每个程序共享相同的内存空间,它现在可以写入另一个程序正在使用的内存 - 导致其他程序崩溃并可能使操作系统不稳定并需要重新启动。

在现代操作系统中,每个程序现在都有自己的虚拟内存空间 - 每个程序认为内存的布局,实际上是由CPU和OS一起生成的虚构内容,这样所有内存的读写操作,如果它们是在界限范围内完成的,被拦截和阻止,并且程序正在编写和读取的内存中的实际位置是程序未知的(这也允许内存从RAM中“分页”到硬盘上,并且当下次检测到需要时,将其分页回到其他位置。

http://en.wikipedia.org/wiki/Paging