# 加载外部程序

## 概述

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

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

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

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

## 实现

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成熟之后，移植过来可好？


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rcore.gitbook.io/rust-os-docs/jia-zai-wai-bu-cheng-xu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
