> For the complete documentation index, see [llms.txt](https://rcore.gitbook.io/rust-os-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rcore.gitbook.io/rust-os-docs/jia-zai-wai-bu-cheng-xu.md).

# 加载外部程序

## 概述

这部分讨论的内容是：在已有线程的条件下，从内核外部加载一段程序运行。

在这个广义的概念下，我们可以做以下事情：

* 加载一个二进制程序，并在用户态运行，这就是所谓的【用户进程】
* 加载一个二进制程序，并在内核态运行，这就是【内核可加载模块】

目前，内核可加载模块功能还没被合并进来。下面简单介绍用户进程的实现。

## 实现

TODO。不难。

## Nebulet

我们的OS可以被视为一个用户程序的运行时环境。但由于用户程序是以机器码形式提供的，直接让CPU运行它可能会破坏掉系统环境，因此当前主流的做法是在硬件上设计用户态，来限制用户程序的行为。不过近年来，内核态和用户态之间频繁切换导致的开销，正在逐渐成为系统性能的瓶颈。

另一方面，假如我们能够从软件上限制用户程序的行为，例如只接受某种虚拟机字节码编写的用户程序，然后在系统中解释执行它，保证所有的异常行为都能被软件拦截并处理。这样是不是就可以把它放到内核态来运行了呢？

今年夏天，一个高中生开发的项目——[nebulet](https://github.com/nebulet/nebulet)，就在进行这个尝试！

它的做法是：用WebAssembly编写用户程序，直接在内核态运行！

[WebAssembly](http://webassembly.org.cn)（Wasm）是新一代浏览器汇编语言。它的设计目标就是在一个沙盒环境中，尽量高效地运行。目前它已经被各大主流浏览器所支持，C、Rust等语言也已经支持编译到wasm字节码。

其实更早应用**软件隔离进程（SIP）**&#x601D;想的实验性OS是[Singularity](https://en.wikipedia.org/wiki/Singularity_%28operating_system%29)，它由微软研究院开发，使用C#（的变体）来编写OS和用户程序，最终编译成CIL执行（类似Java字节码）。据说当年M$希望它能够代替Windows成为下一代OS，不过由于一切都要推翻重写，生态难以建立，最后还是凉凉了。

在这里介绍Nebulet，是希望读者能够关注OS的前沿思想和实践。就像RustOS虽然表面上是用新语言编写，但实质还是大量继承了uCore那种经典的、根植于C语言之上的架构。希望大家能够不断反思既有设计，做出新的尝试和改进。

还有一个计划就是，待Nebulet成熟之后，移植过来可好？
