翻译系统调用是否足以实现 FreeBSD 的 Linux 兼容层?

Is translating system call enough to implement Linux compatibility layer of FreeBSD?

我对 FreeBSD 的 Linux 兼容层的机制很好奇,并在下面得到了一些信息。 https://en.wikipedia.org/wiki/FreeBSD#Compatibility_layers_with_other_operating_systems https://unix.stackexchange.com/questions/172038/what-allows-bsd-to-run-linux-binaries-but-not-vice-versa

两个操作系统的主要区别在于系统调用的不同。 而且,我知道 Linux 应用程序和 BSD 应用程序依赖于不同的标准动态库(例如 linux-gate.so.1)。

执行中还有其他的吗?

某些功能在 Linux(udevsystemd, inotify(7)、...)上可用,但在 FreeBSD 上不可用(反之亦然)。

一些系统调用有不同的标志。 FreeBSD mmap(2) is not exactly the same as Linux mmap(2),等等...

都是Unix系统,细节决定成败

如果您想用 C 编写适用于两种操作系统的应用程序,请努力遵循 POSIX。

能够在 FreeBSD 中 运行 Linux 应用程序的方法是多方面的。

策略的部分,据我理解如下:

  • 提供一个系统调用层,尽可能模仿 Linux 系统调用结构和语义。在 FreeBSD 中,这一层称为 'the linuxolator'
  • 安装一组原版预编译 Linux 用户空间库。这些库之所以有效,是因为 linuxolator 提供了它们所依赖的正确系统调用。
  • Install/provide/mount Linux 用户空间库和应用程序期望的平台服务。例如:
    • 安装一个 Linux 兼容的 procfs - linprocfs。
  • 安装预编译的 Linux 应用程序并让它们依赖于这些 Linux 用户空间库。

Linux 应用程序调用 Linux 库,后者调用 Linuxolator 的 Linux 系统调用,后者调用 FreeBSD 系统调用。