Language agnostic 是否可以运行;本地的;托管操作系统上的代码?

Language agnostic 是否可以运行;本地的;托管操作系统上的代码?,language-agnostic,operating-system,virtualization,Language Agnostic,Operating System,Virtualization,我在读Midori的文章,开始怀疑这是否可能 在托管操作系统上,“托管代码”将是本机代码,“本机代码”将是…外来代码?至少从理论上讲,是否有可能在托管操作系统上运行当前的本机代码?从技术上讲,本机代码模拟器可以用托管代码编写,但不能在裸硬件上运行 我怀疑任何依靠软件验证隔离对共享资源的访问(如Singularity)的托管操作系统是否允许直接运行非托管代码,因为它可能能够绕过软件提供的所有保护(与普通操作系统不同,一些托管操作系统不依赖硬件提供的保护技术)。首先,您应该从定义“托管”和“本机”开

我在读Midori的文章,开始怀疑这是否可能


在托管操作系统上,“托管代码”将是本机代码,“本机代码”将是…外来代码?至少从理论上讲,是否有可能在托管操作系统上运行当前的本机代码?

从技术上讲,本机代码模拟器可以用托管代码编写,但不能在裸硬件上运行


我怀疑任何依靠软件验证隔离对共享资源的访问(如Singularity)的托管操作系统是否允许直接运行非托管代码,因为它可能能够绕过软件提供的所有保护(与普通操作系统不同,一些托管操作系统不依赖硬件提供的保护技术)。

首先,您应该从定义“托管”和“本机”开始。在像Midori这样的“托管”操作系统上,内核仍然是ngen-ed(预编译为机器代码),而不是从IL进行jit编译。因此,我将把它排除在“管理”和“本地”之间

在我看来,“托管”代码和“本地”代码之间还有两个区别——代码的可验证性和资源管理

大多数“本机”代码是无法验证的,因此“托管”操作系统加载程序甚至可能拒绝加载“本机”映像。当然,生成可验证的“本机”代码是可能的,但这会带来很多限制,本质上与“托管”代码没有区别

“托管”操作系统中的资源将由操作系统管理,而不是由应用程序管理。“本机”代码通常分配和清理其资源。如果一个资源是由操作系统API分配给“本机”代码的,那么会发生什么呢?反之亦然?应该有非常明确的规则,规定谁以及何时进行资源管理和清理。出于安全原因,我无法想象操作系统除了进程虚拟内存之外,还能直接控制“本机”代码和任何资源。因此,使用“本机”的唯一原因是实现您自己的内存管理


今天的“natve”代码不会遵守上述任何规则。因此,“托管”操作系统应该拒绝直接执行它。不过,“托管”操作系统可能会提供一个类似Hyper-V的虚拟化层,并在虚拟机中承载“本机”代码。

我认为托管的意思是,代码运行在一个环境中,该环境对代码进行类型安全、安全内存访问等检查,而本机则相反。现在,这个执行环境决定了它是否允许本机代码在未经验证的情况下运行。这样看:操作系统和上面的应用程序都需要一个执行环境来运行。它们之间的唯一关系是,顶级应用程序正在调用底层操作系统以执行较低级别的任务,但在调用操作系统时,它实际上是由执行环境执行的(执行环境可能/可能不支持代码验证,具体取决于编译代码时传递的选项),并且控制权转移到操作系统时,执行环境再次负责执行操作系统代码(这个环境可能是另一个环境),在这种情况下,它会验证操作系统代码(因为它是一个托管操作系统)


因此,理论上,本机代码可能/可能不会在托管操作系统上运行。这完全取决于其运行所在的执行环境的行为。操作系统是否受管理不会影响其是否在其上运行。如果顶级应用程序和操作系统都具有相同的执行环境(受管理),则本机代码将不会在操作系统上运行。

摘自MS研究论文(第9页):

原则上,保护域可以承载单个进程 包含用不安全语言编写的无法验证的代码,如 C++。虽然对于运行遗留代码非常有用,但我们没有 然而,他探索了这种可能性。目前,一个 保护域也包含在SIP中,SIP将继续 提供隔离和故障遏制边界

因此,尽管目前尚未探索,但这似乎是一种明显的可能性。非托管代码可以在受硬件保护的域中运行,处理虚拟内存、TLB等会降低性能。但系统作为一个整体,可以在运行非托管代码时安全地维护其不变量