6

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

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

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

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

4

2 回答 2

3

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

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

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

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

在操作系统内核之外运行的软件也可能无法访问 CPU 内存范围的特定硬编码,CPU 也可以轻松地在此处进行检查。

MIPS 似乎就是这种情况(来自“Application Note 235 - Migrating from MIPS to ARM”)

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

在此处输入图像描述

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

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

于 2011-11-18T06:58:50.873 回答
2

这确实是通过 TLB 完成的。无执行位(NX 位)仅在几年前才流行起来,因此较旧的 MIPS 处理器不支持它。最新版本的MIPS 架构(第 3 版)和SmartMIPS 应用程序特定扩展支持它作为可选功能,名为XI(执行抑制)

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

于 2011-11-18T09:08:36.837 回答