Wasm 是一种轻量级、高效、安全的运行时,非常适合资源有限的设备。它还灵活且独立于平台,这使得为各种硬件开发应用程序变得容易。
随着世界变得更加互联,物联网 (IoT) 设备的数量呈爆炸式增长。这些设备具有各种形状和尺寸,从大型工业机器到微型传感器。虽然较大的设备可能在 Linux 或其他操作系统上运行,但较小的设备需要不同的方法。在本文中,我将解释为什么 WebAssembly (Wasm)是微型 IoT 设备的完美运行时,这些设备对于 Linux 而言太小并且可能需要依靠电池供电。
挑战
首先,让我们看看在微型物联网设备上运行传统操作系统的挑战。这些设备通常是低功率的并且具有有限的内存和存储容量。运行 Linux 等成熟的操作系统需要大量资源,这会很快耗尽设备的电池寿命。
此外,这些设备可能没有支持完整 Linux 操作系统所需的硬件,例如硬件虚拟内存所需的 MMU(内存管理单元)。存在用于微型物联网设备的各种 RTOS(实时操作系统)——一些示例包括 FreeRTOS、ThreadX 和 NuttX。因此,我们不能在这些微型物联网设备上使用 Linux 容器(也称为 Docker)作为隔离单元。
其次,嵌入式系统(如物联网设备)的传统开发周期与云软件有很大不同。尽管对代码进行更改可能并不复杂,但将它们交付给客户却是一个复杂的过程。通常,每月会有一次代码冻结,在此期间,所有修改都会经过全面的硬件在环测试,可能会在许多类型的设备上进行。
在成功测试新版本后,将启动分阶段推出流程,以防止固件更新、客户投诉或支持升级等问题。微小的代码更改可能需要数周甚至数月才能到达大多数客户。这个过程在敏捷开发和云时代已经不可接受了。
WebAssembly
输入 WebAssembly。Wasm 是一种基于堆栈的虚拟机和字节码格式。最初是为 web 浏览器插件设计的,它不仅限于 web 应用程序。它是一个多功能的运行时,可用于广泛的应用程序,包括 IoT 设备。Wasm 被设计为小巧高效,这使其非常适合微型物联网设备。
Wasm 模块的大小通常为几千字节,比典型的 Linux 内核或 Linux 容器小得多。这种小尺寸意味着 Wasm 可以在内存和存储容量有限的设备上运行,并具有本机性能。
将 Wasm 用于 IoT 设备的另一个优势是它是一个独立于平台的运行时。这意味着 Wasm 模块可以用任何编程语言编写,并可以在任何支持 Wasm 的平台上执行。这种灵活性使得为物联网设备开发应用程序变得容易,无论硬件或软件环境如何。
开发者可以用自己喜欢的编程语言编写代码,然后编译成 Wasm,可以在目标设备上执行。C、C++、Rust、JavaScript 得到很好的支持。需要垃圾收集的语言得到的支持较少,但这是由于随着 Wasm 规范的发展而发生变化。
Wasm 模块在沙盒环境中执行,这意味着它们与系统的其余部分隔离。这使得攻击者难以利用系统中的漏洞,因为他们无法访问底层操作系统或硬件。这对于没有虚拟内存的微型物联网设备尤为重要。此外,Wasm 模块可以在部署之前进行验证和签名,这为系统增加了额外的安全层。
一些 Wasm 运行时支持 AoT(提前)编译,它采用 Wasm 字节码并为目标 CPU/MCU 类型生成机器码。这在微型物联网设备的环境中非常有用,甚至是必不可少的,因为这些设备可能没有可用的 CPU 和内存来执行 JIT(即时)编译,而我们通常在云端或桌面上这样做。
AoT 编译可以是管理部署在物联网设备上的软件生命周期的云服务的一部分。AoT 编译的代码几乎可以以本机速度运行,并且比 Micropython 等解释语言快几个数量级。
到期
虽然 Wasm 已经存在了好几年,但它仍然是一项相对较新的技术。与传统编程语言和框架相比,Wasm 可用的工具和库不多。Wasm 规范的某些部分仍在不断发展,例如 Python 等流行语言所需的 GC 原生支持。然而,随着越来越多的开发人员将 Wasm 用于各种应用程序,这种情况正在迅速改变。
将 Wasm 用于 IoT 设备的另一个困难是缺乏对硬件特定功能的支持。由于 Wasm 是独立于平台的运行时,它无法直接访问设备的硬件或传感器等外围设备。
开发人员必须结合使用 Wasm 和本机代码来访问设备的硬件,并创建一个 WASI API 扩展来抽象硬件功能并将其暴露给 Wasm 模块。Wasm 社区正致力于在WASI(WebAssembly 系统接口)规范中标准化各种系统接口。
结论
总的来说,将 Wasm 用于 IoT 设备的好处远远超过潜在的缺点。Wasm 是一种轻量级、高效、安全的运行时,非常适合资源有限的设备。它还具有灵活性和平台无关性,这使得为各种硬件和软件环境开发应用程序变得容易,并为微型物联网设备带来敏捷开发。
随着物联网设备数量的持续增长,Wasm 将成为开发人员越来越重要的工具,他们希望为这些设备创建高效、安全的应用程序。随着边缘计算的重要性日益增加和物联网的兴起,很明显 WebAssembly 将在未来的计算中发挥重要作用。
原作者 | Dan Mihai Dumitriu
译者:DeeTeam