【问题标题】:MIPS memory execution preventionMIPS 内存执行预防
【发布时间】:2011-12-31 22:56:53
【问题描述】:

我正在对 MIPS 架构进行一些研究,并且想知道如何使用 mips 提供的有限指令和内存保护来实现操作系统。我特别想知道操作系统如何阻止某些地址范围被执行。例如,操作系统如何限制 PC 在特定范围内运行?换句话说,防止诸如从动态分配的内存中执行之类的事情?

首先想到的是 TLB,但 TLB 只提供内存写保护(而不是执行)。

我也不太明白操作系统如何处理它,因为这意味着每条指令都会导致异常,然后会烧掉许多周期,只是检查 PC 是否在正常的地址范围内.

如果有人知道,它通常是如何完成的?它是否在初始化期间由硬件以某种方式处理(例如,它被赋予了一个地址范围,如果它超出范围,则会遇到异常?)

【问题讨论】:

    标签: memory operating-system mips computer-architecture tlb


    【解决方案1】:

    这确实是通过 TLB 完成的。 No Execute Bits (NX bits) 几年前才流行起来,所以旧的 MIPS 处理器不支持它。最新版本的MIPS architecture(Release 3)和SmartMIPS Application-Specific Extension 支持它作为一个可选功能,名称为XI(执行禁止)

    如果您的芯片没有此功能,那您就不走运了。就像 Alex 已经说过的那样,没有简单的方法可以模拟此功能。

    【讨论】:

      【解决方案2】:

      大多数保护检查都是在硬件中由 CPU 本身完成的,不需要操作系统方面的太多参与。

      操作系统设置了一些特殊的表(页表或段描述符等),其中内存范围具有相关的读取、写入、执行和用户/内核权限,然后 CPU 在内部缓存这些权限。

      CPU 然后在每条指令上检查内存访问是否符合操作系统建立的权限,如果一切正常,则继续。如果试图违反这些权限,CPU 会引发操作系统处理的异常(一种类似于来自 CPU I/O 设备外部的中断的形式)。在大多数情况下,操作系统会在遇到此类异常时简单地终止有问题的应用程序。

      在其他一些情况下,它会尝试处理它们并使看似损坏的代码正常工作。其中一种情况是支持虚拟磁盘内存。当一个区域没有由物理内存备份并且它的数据位于磁盘上的某个位置时,操作系统会将其标记为不存在/不可访问。当应用程序尝试使用该区域时,操作系统会从尝试访问该内存区域的指令中捕获异常,用物理内存支持该区域,用磁盘中的数据填充它,将其标记为存在/可访问并重新启动导致异常的指令。当操作系统内存不足时,它可以将数据从某些范围卸载到磁盘,再次将这些范围标记为不存在/不可访问,并从这些区域回收内存用于其他目的。

      也可能有特定的 CPU 内存范围硬编码,在 OS 内核之外运行的软件无法访问,CPU 也可以在这里轻松地进行检查。

      这似乎是 MIPS (from "Application Note 235 - Migrating from MIPS to ARM") 的情况:

      3.4.2 内存保护 MIPS 仅在前面描述的范围内提供内存保护,即地址 在用户模式下,不允许在地址空间的高 2GB 中使用。 不可能有更细粒度的保护机制。

      This document 在其他 MIPS 异常中列出“MEM - 数据提取页面错误;未对齐的内存访问;违反内存保护”。

      如果特定版本的 MIPS CPU 没有任何更细粒度的保护检查,则它们只能由操作系统模拟,并且成本很高。操作系统需要逐条执行代码,或者将其翻译成几乎等效的代码,插入地址和访问检查并执行该代码而不是原始代码。

      【讨论】:

        猜你喜欢
        • 2011-07-31
        • 2011-07-11
        • 2015-11-06
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多