实现细节
在许多方面,Zephyr 提供的支持与任何 POSIX OS 类似:API 绑定以 C 编程语言提供;进行配置后,POSIX 头文件可在标准包含路径中使用。
与其他多用途 POSIX 操作系统不同:
Zephyr 并不是“一个 POSIX OS”。Zephyr 内核并非围绕 POSIX 标准设计,POSIX 支持是一项需要显式启用的特性
Zephyr 应用不会单独链接,也不作为子进程执行
Zephyr、库和应用代码一起编译和链接,在单个(可能是虚拟的)地址空间中以类似单进程应用的方式运行
Zephyr 不提供 POSIX shell、编译器或实用工具,也不具备自托管能力。
备注
与 Linux 内核或 FreeBSD 不同,Zephyr 不为每种受支持的架构维护静态的系统调用编号表,而是在构建时动态生成系统调用。更多信息请参阅 系统调用。
设计
作为一个库,Zephyr 的 POSIX API 实现力求成为应用、中间件与 Zephyr 内核之间的薄抽象层。
一些通用设计考虑:
POSIX 接口及实现应属于 Zephyr 的 POSIX 库,而不应放在其他地方,除非 POSIX API 实现和某个其他特性都需要它们。实现应保留在 POSIX 实现内部的例子是
getopt()。实现应作为独立库的例子是多线程和网络功能。当 POSIX API 与另一个 Zephyr 子系统都依赖某个特性时,该特性的实现应作为一个独立的 Zephyr 库,供 POSIX API 以及另一个库或子系统共同使用。这可以降低代码中出现依赖环的可能性。在可行的情况下,该规则还应扩展到宏。在下面的示例中,
libposix依赖libzfoo来实现 Zephyr 中的某项功能“foo”。如果libzfoo也依赖libposix,就会形成依赖环。这一环可以通过相互依赖的libcommon来消除。
POSIX API 调用应当以普通的可调用 C 函数形式提供;如果实现中需要使用 Zephyr 的 系统调用,该系统调用的声明和实现应隐藏在 POSIX API 之后。