加载外部程序

概述

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

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

  • 加载一个二进制程序,并在用户态运行,这就是所谓的【用户进程】

  • 加载一个二进制程序,并在内核态运行,这就是【内核可加载模块】

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

实现

TODO。不难。

Nebulet

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

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

今年夏天,一个高中生开发的项目——nebulet,就在进行这个尝试!

它的做法是:用WebAssembly编写用户程序,直接在内核态运行!

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

其实更早应用软件隔离进程(SIP)思想的实验性OS是Singularity,它由微软研究院开发,使用C#(的变体)来编写OS和用户程序,最终编译成CIL执行(类似Java字节码)。据说当年M$希望它能够代替Windows成为下一代OS,不过由于一切都要推翻重写,生态难以建立,最后还是凉凉了。

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

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

Last updated