Skip to content

1. 运行时环境的作用

  • 程序运行的依赖
    程序运行不仅依赖于指令集(如TRM), 还需要操作系统、库函数和其他运行时支持。这为程序提供了加载、链接、销毁以及运行时所需的各种服务。

  • 结束运行的机制
    由于大多数程序都具有结束运行的需求,运行时环境需要提供一种标准的结束方式。例如,在 NEMU 中通过特殊的 nemu_trap 指令结束程序.

2. 运行时环境的最小条件

  • 内存支持:程序必须被加载到合适的内存位置.
  • PC 指向:程序计数器(PC)指向程序的第一条指令,开始执行.
  • 结束运行机制:必须提供一种机制(例如 nemu_trap 指令)通知程序结束.

这三点构成了最基本的运行时环境支持,使程序能被正确加载、执行,并安全退出.

3. 将运行时环境封装成库函数

  • 跨架构支持
    不同的ISA(指令集架构)和平台对一些运行时操作(例如结束运行)的实现方式可能不同.

  • 抽象和解决问题的思路
    为了避免为每个程序和每个架构分别编写代码,可以将运行时支持(如结束程序)抽象为一个统一的API,比如 void halt().

  • 程序调用 halt(),而具体如何结束运行则由各个架构实现自身的 halt() 函数.
  • 这种方式实现了程序与底层架构的解耦,减少了代码冗余.
  • 总体需要维护的是:程序部分的代码(n个)加上架构相关的抽象实现(m个),而非 n * m 种实现.

  • 库的作用
    将公共要素抽象为库函数,可以大大提升开发效率,让程序开发者只需调用这些API,而不必关心底层架构细节. 这正是运行时环境以库的形式存在的体现.

4. 总结

  • 抽象和解耦
    通过抽象出统一的API(例如 halt()),程序与具体架构的实现细节分离,易于维护和扩展.

  • 运行时环境的重要性
    程序的正确加载、执行和退出都依赖于完整的运行时环境支持,包括内存管理、指令执行和结束程序机制等.

  • 库函数的设计
    将常用的运行时功能如加载、销毁程序等抽象成库函数,可以实现跨平台的运行支持,避免不同平台代码重复开发,降低系统复杂度.

这种设计思路符合KISS(Keep It Simple and Stupid)原则,确保系统只关注必要的功能,同时通过抽象提高代码复用和灵活性.