当前位置: 首页 > 科技观察

操作系统-虚拟化安全KA:内存保护和地址空间

时间:2023-03-16 01:52:11 科技观察

内存保护和地址空间访问控制只有在安全域彼此隔离时才有意义。为此,我们需要根据访问权限和可以授予或撤销此类访问权限的特权实体分离安全域的数据。我们先看隔离,等到介绍保护环的时候再讨论特权。如果没有适当的访问控制检查,一个进程通常不能读取另一个进程的数据。Multics和几乎所有后续操作系统(例如UNIX和Windows)通过为每个进程提供(a)自己的处理器状态(寄存器、程序计数器等)和(b)自己的内存子集来隔离进程内的信息。每当操作系统决定以当前正在运行的进程P1(所谓的上下文切换)为代价执行进程P2时,它首先停止P1并将其所有处理器状态保存在其他进程无法访问的内存区域中。接下来,它将P2的处理器状态从内存加载到CPU,调整确定物理内存的哪些部分可访问的簿记,并开始在程序计数器指示的地址处执行P2,它刚刚作为处理器状态的一部分加载。由于用户进程无法直接操作簿记本身,因此P2无法以非中介形式访问P1的任何数据。如图所示,大多数现代操作系统通过页表跟踪内存簿记。2.对于每个进程,它们维护一组页表(通常包含组织为有向无环图6的多个级别),并将指向顶级页表的指针存储在寄存器中,这是处理器状态部分,必须保存并在上下文切换时恢复。页表结构的主要目的是为每个进程提供自己的虚拟地址空间,范围从地址0到某个最大地址(例如248),即使物理内存的数量可能要少得多。由于两个进程都可以在地址0x10000存储数据但不应允许访问彼此的数据,因此必须存在来自虚拟的映射。每个进程使用的地址到硬件使用的物理地址。这就像一场篮球比赛,每一方可能都有一名号码为23的球员,但该号码对应于每位球员的不同物理球员。团队。这就是页表的用武之地。我们将每个虚拟地址空间划分为固定大小的页面,并使用页表结构将虚拟页面的第一个字节的地址映射到物理地址。处理器经常使用多级转换。传说中。2.它使用虚拟地址的前九位作为顶级页表的索引(由处理器状态的一部分的控制寄存器指示)来查找包含下一级页面物理地址的条目表,它由接下来的九位索引确定,依此类推,直到我们到达页表的最后一级,其中包含包含虚拟地址的物理页面的物理地址。虚拟地址的最后12位只是此页的偏移量,并指向数据。分页允许进程的虚拟地址空间的(总)大小远大于系统中可用的物理内存。首先,进程通常不会使用其所有潜在的巨大地址空间,只有实际使用的虚拟页面需要由物理页面支持。其次,如果一个进程需要更多的内存来存储一些数据,而此时没有可用的物理页面(例如,因为它们已经被其他进程使用,或者他们正在为这个进程备份一些其他虚拟页面),OS可能会将这些页面的内容交换到磁盘,并重新使用物理页面来存储新数据。图2:现代处理器中的地址转换。MMU“遍历”页表以找到页面的物理地址。如果页面“映射”在进程的页表上,则进程只能寻址页面,假设它存在并且进程具有适当的访问权限。具体来说,用户进程无法访问在页表条目中设置了主管(S)位的页。这种组织的一个关键结果是,如果进程的页表中存在映射,则进程只能访问内存中的数据。是否是这种情况,由操作系统控制,因此操作系统可以准确决定哪些内存应该是私有的,哪些内存应该共享,以及与谁共享。保护本身由称为内存管理单元(MMU7)的专用硬件实现。如果特定地址的虚拟到物理映射不在称为事务后备缓冲区(TLB)的小型但速度非常快的缓存中,则MMU将通过遍历页表来查找它,然后如果页面包含地址未映射。如果页面当前不在内存中(交换到磁盘),或者如果与安全相关的用户没有访问此内存所需的权限,则MMU也会触发中断。具体来说,页表条目(PTE)的最后12位包含一组标志,其中一个是图中的S位。2,表明这是主管代码页面(例如,以最高权限运行的操作系统)还是普通用户进程。稍后我们将更详细地介绍特权。页表是现代操作系统控制内存访问的主要方式。然而,一些(主要是较旧的)操作系统还使用了另一个技巧:分段。毫不奇怪,最早使用分段和分页的操作系统之一是Multics。与页面不同,段的长度是任意的,并且可以从任意地址开始。但是,两者都依赖于硬件支持:MMU。例如,Intel的32位x86等处理器有一组称为段选择器的专用寄存器:一个用于代码,一个用于数据等。每个段都有特定的权限,如读、写或执行。给定一个虚拟地址,MMU使用相应段选择器中的当前值作为所谓的描述符表的索引。描述符表中的条目包含段的起始地址和长度,以及防止代码在没有必要特权级别的情况下访问它的保护位。如果只有段而没有分页,则生成的地址将是添加到段开头的原始虚拟地址,这将是物理地址,我们就完成了。然而,用于Multics的GE-645大型计算机和更现代的x86-32都允许组合分段和分页。在这种情况下,首先使用段描述符表将虚拟地址转换为所谓的线性地址,然后使用页表结构将这种线性地址转换为物理地址。这听起来很复杂;流行的现代操作系统都没有使用分段。使用分段的操作系统最著名的例子是OS/2(Microsoft和IBM之间命运多舛的合作,始于80年代中期,但从未流行起来)和IBM的AS/400(也在1980年代推出8,至今仍在今天在您附近的大型机上愉快地运行)。Xen管理程序还在32位x86上使用分段,但这在64位系统上不再可能。事实上,Intelx64的66位版本甚至不再支持完全分段,尽管其功能的一些痕迹仍然存在。另一方面,复杂的多级地址转换在虚拟化环境中仍然很常见。在这里,hypervisor试图给虚拟机一种错觉,即它们本身都在真实硬件上运行,因此MMU首先将虚拟地址转换为所谓的客户物理地址(使用页表)。不过,这还不是真正的物理地址,因为很多虚拟机可能都有相同的想法,使用物理地址0x10000。因此MMU使用第二个转换阶段(使用Intel所谓的扩展页表,由管理程序维护)将来宾物理地址转换为主机物理地址(“机器地址”)。