翻译系统调用是否足以实现 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(udev
、systemd, 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 系统调用。
我对 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(udev
、systemd, 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 系统调用。