加载外部程序
这部分讨论的内容是:在已有线程的条件下,从内核外部加载一段程序运行。
在这个广义的概念下,我们可以做以下事情:
- 加载一个二进制程序,并在用户态运行,这就是所谓的【用户进程】
- 加载一个二进制程序,并在内核态运行,这就是【内核可加载模块】
目前,内核可加载模块功能还没被合并进来。下面简单介绍用户进程的实现。
TODO。不难。
我们的OS可以被视为一个用户程序的运行时环境。但由于用户程序是以机器 码形式提供的,直接让CPU运行它可能会破坏掉系统环境,因此当前主流的做法是在硬件上设计用户态,来限制用户程序的行为。不过近年来,内核态和用户态之间频繁切换导致的开销,正在逐渐成为系统性能的瓶颈。
另一方面,假如我们能够从软件上限制用户程序的行为,例如只接受某种虚拟机字节码编写的用户程序,然后在系统中解释执行它,保证所有的异常行为都能被软件拦截并处理。这样是不是就可以把它放到内核态来运行了呢?
它的做法是:用WebAssembly编写用户程序,直接在内核态运行!