首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在从头构建操作系统时,如何优化和安全地隔离进程?

在从头构建操作系统时,如何优化和安全地隔离进程?
EN

Software Engineering用户
提问于 2019-12-01 01:27:08
回答 2查看 290关注 0票数 0

我正在尝试在JavaScript中构建模拟操作系统的软件。出于各种目的和目的,它是一个操作系统,尽管它是JavaScript,我们基本上是在Node.js或浏览器中运行。但这不重要,事实是它是JavaScript。在这方面,它可以是任何语言或平台。

我坚持的是开始。我习惯于用在操作系统之上的高级语言编写代码,所以流程体系结构已经构建好了,所以我从未真正处理过它。

最广泛的问题是:我如何创建流程架构?

具体问题是:在高层次上,如何在理论上创建安全隔离的流程?

我基本上有这样的想法:

代码语言:javascript
复制
var all_processes = []
var specific_process = -1

function set_process(index) {
  if (all_processes[index]) {
    throw new Error('Process taken')
  } else {
    specific_process = index
    all_processes[index] = {}
  }
}

function call_function(name, ...args) {
  all_processes[specific_process][name](...args)
}

但我想象的是做异步和多线程等,所有的过程的花哨功能。我想知道你是如何以一种安全的方式基本上可以保持过程隔离的。操作系统是怎么做到的?因为您需要在某个时候创建和管理流程,但是进程本身无法通信(除非通过特定的协议)。因此,在某种程度上,我需要将特定的进程传递给每个函数调用,但是这样就失去了在每个参数中没有进程的干净API。但是,如果您这样做了,那么您不抓取另一个进程并传递它(即,如何维护只访问该进程的安全性?)此外,检查每个调用的进程将增加性能开销。

本质上,如何创建安全的流程,至少在高层次上,我应该搜索/寻找什么,如果不是描述如何实现它的话。

维基百科说:

进程隔离可以用虚拟地址空间实现,其中进程A的地址空间不同于进程B的地址空间--防止A写入B。

我不明白这意味着什么,到底该怎么做。这使我的代码在理论上看起来像什么?

也许沙箱提供了一些洞察力,但维基百科并没有提供太多信息,它没有提供更多细节,而是委托给操作系统:

沙箱是通过在受限的操作系统环境中执行软件来实现的,从而控制资源(例如文件描述符、内存、文件系统空间等)。一个进程可能会用到的。

特权也没有透露多少信息。

的文件如下:

大多数操作系统使用CPU的内存管理硬件来提供进程隔离,使用两种机制。首先,进程只允许访问某些物理内存页。第二,权限级别防止不受信任的代码操作实现进程的系统资源,例如内存管理单元(MMU)或中断控制器。这些机制的非平凡性能代价很大程度上是隐藏的,因为没有广泛使用的替代方法来比较它们。从虚拟地址到物理地址的映射可能会导致高达10-30%的开销,原因是异常处理、内联TLB查找、TLB重新加载以及内核数据结构(如页表29 )的维护。此外,虚拟内存和权限级别增加了进程间通信的成本.

作为一种解决方案,他们提出了软件隔离过程(SIPs),并说:

一个基于SIPs的系统的设计和实现是这项工作的一个重要贡献。软件隔离流程是内存页的集合,也是一种语言安全机制,它确保流程中的代码不能访问另一个进程的页面。SIP以程序安全性的静态验证代替硬件内存保护。奇点使用语言安全和建立在通道15上的快速通信机制来执行一个系统范围的不变量,即内核和任何其他进程都不包含对给定进程的对象空间的引用。由于不同进程的对象空间总是驻留在不相交的内存页上,因此当进程终止时,内存回收非常简单。

我不明白这怎么能成功。虽然这很有帮助:

此外,系统还保持不变的状态,即在exchange堆中最多存在一个指向项的指针。当进程发送消息时,它将失去对消息的引用,该消息将被传输到接收进程(类似于通过邮政邮件发送信函)。因此,进程不能使用这个堆作为共享内存,而且消息可以通过指针传递而不是复制非常有效地交换。

EN

回答 2

Software Engineering用户

发布于 2019-12-01 01:46:07

正如维基百科所说,您将一个进程分配到一个地址空间,不要让地址空间重叠。

首先,您可以使用javascript数组作为地址空间。然后对每个进程都有不同的这样的数组。虽然进程可以在内部使用自己的索引来访问自己的内存,但它永远无法索引到另一个进程的地址空间(另一个进程的数组)。

异步和多线程与进程是正交的。这两个术语都不意味着进程间通信,您需要某种形式的进程间通信,无论是网络数据包、共享内存还是共享文件。

票数 3
EN

Software Engineering用户

发布于 2019-12-01 14:02:04

它可能有助于突出这里的基本知识。请注意,内存保护通常是在现代处理器的硬件级别上内置的。对于英特尔家族来说,这是从80286处理器开始的。80386体系结构进一步增强了内存管理功能,该体系结构存在了很长时间。关键是,要在软件中实现这些特性,基本上需要编写一个解释器。对你来说,这是控制局面的唯一方法。

微处理器的处理方式有点不同。虽然它基本上是一个解释器,但在执行每条指令之前对其执行访问检查是效率低下的。但是,它可以为代码的执行设置舞台,以便当内存被寻址到进程指定的范围之外时,硬件中断就会发生。这很便宜(有效率)。在您的JavaScript程序中,您没有办法走这条路。

因此,尽管它可能是一个很好的练习,但是对于流行的操作系统来说,不要期望它接近一个通用的实现。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/401859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档