操作系统如何检测内存访问冲突


12

操作系统(最好是Linux)如何知道您访问了不允许访问的内存位置?

这个问题的灵感来自那些该死的指针!我的看法是:计算机中的所有内容都涉及速度,安全性,完整性等方面的折衷。

我非常了解Linux中的内存映射,但是每次内核访问内核时,内核都会检查您尝试访问的位置是否位于有效范围内,这听起来有点荒谬。听起来这会浪费很多时间,而这可能会花费在做一些更有生产力的事情上(但是如果不做检查的话,安全性可能会降低!)。还是它会记住所有最近的访问并在每个硬件计时器滴答时检查它们?(但这听起来不安全,但又慢了。)

我很惊讶这个问题似乎在任何地方都没有答案。这是我一直想知道的事情。这让我认为有一部分硬件可以很好地,方便地抽象代表操作系统。但是,仍然可能需要在每个上下文切换上加载下一个进程的内存映射,这听起来还是很慢。

所以是的,无论如何,我要继续讲一点:操作系统如何检测到内存冲突?

谢谢

Answers:


11

(以下答案假定为“现代”台式机,服务器或高端嵌入式平台(例如智能手机以及越来越多的小型系统)。对于x86系统,modern表示386及更高版本。以下答案还假定为“现代”操作系统,例如几乎所有的Unix或95以后的Windows。)

这不是在OS中发生,而是在处理器中发生,特别是在MMU内存管理单元)中。MMU支持虚拟寻址,构成指针的位不直接指示内存中位的物理位置。

在典型的MMU中,当指针被取消引用时,MMU将这些位分解为两组:高位组成号,低位组成页内的地址。大多数台式机和服务器计算机使用4kB页面。MMU在称为TLB的表中查找虚拟页码(这就是您所说的“进程内存映射”)。TLB指示与该虚拟页面相对应的物理页面的编号。然后,MMU从内存中的物理页面获取数据。

如果TLB不包含该特定虚拟页码的条目,则MMU通知处理器发生了无效的访问;否则,MMU会通知处理器。这通常称为异常。

请注意,到目前为止,我还没有提到操作系统。这是因为所有这些操作都独立于操作系统。操作系统之所以起作用,是因为它以两种方式配置事物:

  • 操作系统负责切换任务。当您怀疑这样做时,它将保存当前的TLB,并用保存的TLB替换下一个计划任务。这样,每个进程都有一个TLB,因此0x123456进程X中的地址可能不指向RAM中与进程Y中相同地址的相同实际位置,或者可能只是无效。如果一个进程试图在其地址空间之外取消对指针的引用,则它不会到达另一个进程的空间,而是到达无处

  • 操作系统决定引发异常时发生的情况。它可以终止进行无效内存访问的过程(分段错误,常规保护错误等)。这也是实现交换的方式:异常处理程序可能会决定从交换空间中获取一些数据,相应地更新TLB并再次执行访问。

请注意,MMU提供安全性,因为进程无法更改其自己的TLB。仅操作系统内核可以更改TLB。TLB更改权限的工作方式超出了此答案的范围。


6

1)内存管理单元检测到段错误。当您请求内存时,操作系统会要求内存管理单元从硬件中获取一些信息。必须有某种东西可以跟踪操作系统为您提供的所有大内存块。操作系统将其交给MMU。由于它知道它为您提供的所有内存,因此它还可以告诉您何时尝试访问未从分配中获取的内存位置。操作系统专门为此提供了一个事件,您不拥有该内存。最终,操作系统杀死了您的应用程序,从而触发了段错误或其他操作系统上的同等功能。

并非所有操作系统都具有此保护。尽管MMU确实支持此功能,但MacOS最多9个都没有。Win 3.1都没有。Win95有一些保护,因为它在没有保护然后再添加一些之间过渡。

2)操作系统除此以外不知道其他详细信息。如果您有一个散乱的指针访问从未分配过的内存,它就会知道。如果您的应用程序进入了应用程序的另一部分,那么当然不知道。它可以让您破坏它。这是您损坏堆栈的地方,应用程序的杂散指针会覆盖应用程序的其他部分。

因此,是的,您可以修改自己的数据。如果您有一个杂散的指针覆盖了您自己的应用程序,那么您希望命中您的堆栈,因为当您尝试返回堆栈时,这可能会遇到另一种违规行为,但是如果您命中自己的数据,您将一无所知。

您可以尝试比“无保护”更为严格,有一个名为Electric Fence的工具(http://perens.com/FreeSoftware/ElectricFence/),它将使您的MMU发挥更多作用,并使其检测到更多故障。


好的,您能否更具体地说明其工作原理?就像,它如何知道特定进程无法访问特定位置?是什么告诉它哪些进程可以在哪里访问?有何区别?谢谢

1
@panic-在Wikipedia中查找Memory_management_unit以及该页面上的链接。请注意,进程状态包括MMU状态。您可以在MMU设计,功能和集成上花几个学期。
mpez0 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.