Linux kernel 为什么有些Linux系统不支持open()系统调用?

Linux kernel 为什么有些Linux系统不支持open()系统调用?,linux-kernel,arm64,archlinux-arm,Linux Kernel,Arm64,Archlinux Arm,我正在内联系统调用。是的,我理解这是有问题的,但我有一个很好的理由。我已经找到了我的bug,我只是想问为什么在这个arm64 Arch Linux系统上uu NR_uopen消失了 5.0.1-1-ARCH 1 SMP Sun Mar 10 15:08:34 MDT 2019 aarch64 GNU/Linux 同样,我的代码是内联系统调用。这种内联方法适用于另一个X86_64系统,实际上内联mmap也适用于这个系统。但是,此arm64 Arch Linux上的内联打开失败,并导致EFAULT

我正在内联系统调用。是的,我理解这是有问题的,但我有一个很好的理由。我已经找到了我的bug,我只是想问为什么在这个arm64 Arch Linux系统上uu NR_uopen消失了

5.0.1-1-ARCH 1 SMP Sun Mar 10 15:08:34 MDT 2019 aarch64 GNU/Linux

同样,我的代码是内联系统调用。这种内联方法适用于另一个X86_64系统,实际上内联mmap也适用于这个系统。但是,此arm64 Arch Linux上的内联打开失败,并导致EFAULT

跟踪我的bug,首先,在这个构建环境中甚至没有定义\uuu NR\u open。其次,regular open调用open64,open64执行一条svc指令,其中x8设置为56。第三,uuu NR_open通常被定义为5,该数字已被重新调整为uu NR_setxattr。这就解释了EFAULT

基本上,open在这个系统的用户库中被转换成openat,而_NR_open系统调用已经完全消失,被一个新的系统调用接管。我不明白的是_unr_uopen是在for arm64中定义的,但不是在这个Arch Linux arm64系统上定义的

我的bug修复很简单:改为内联openat。但我的问题是,为什么要删除它,为什么不认为它是从Linux POV中断开的?我在想Linus说我们不会破坏用户空间!我不是从POSIX的角度来考虑这个问题的。事实上,Linux编程接口并没有涵盖这一删除,至少没有明确说明

为什么某些Linux系统支持开放系统调用,而其他系统不支持开放系统调用

现在,技术上的答案很简单:

因为有人是这样写的

但我的问题是,为什么要删除它,为什么不认为它是从Linux POV中断开的

这不是一个技术问题,而是一个哲学问题

怎样才能阻止任何人分叉Linux内核并对其进行任意更改? 我已经有一段时间没有读过GNU GPL了,但我记得没有类似的限制。 也许破坏系统调用ABI兼容性被认为是从Linux POV中分离出来的,但据我所知,这种观点对任何第三方都没有有效的法律或物理权力

问问你正在运行的AArch64 Linux fork的发货人,也许这些功能会让你了解他们选择背后的原因

为什么某些Linux系统支持开放系统调用,而其他系统不支持开放系统调用

现在,技术上的答案很简单:

因为有人是这样写的

但我的问题是,为什么要删除它,为什么不认为它是从Linux POV中断开的

这不是一个技术问题,而是一个哲学问题

怎样才能阻止任何人分叉Linux内核并对其进行任意更改? 我已经有一段时间没有读过GNU GPL了,但我记得没有类似的限制。 也许破坏系统调用ABI兼容性被认为是从Linux POV中分离出来的,但据我所知,这种观点对任何第三方都没有有效的法律或物理权力


询问您正在运行的AArch64 Linux fork的发货人,也许他们的功能会让您了解他们选择背后的原因。

您正在查看的文件arch/arm64/include/asm/unistd32.h是arm32兼容模式的系统调用定义

本机aarch64的系统调用定义来自通用系统调用表,您可以看到该表未定义_NR_open。系统调用未被删除-它从未在aarch64上存在

通用表中未定义_NR_open的原因是openat2系统调用是后来引入的,并且是_NR_open功能的严格超集,因此在引入openat2后创建的新体系结构端口提供该系统调用没有意义-它是冗余的。POSIX open函数由用户空间C库提供,调用openat2系统调用


openat2之前存在的旧体系结构端口(如x86和arm32)必须继续包括open2,因为调用open2系统调用的体系结构肯定存在旧程序/库二进制文件。这种担心不适用于新的体系结构端口-打破的用户空间保证是,如果它昨天起作用,今天就起作用,但它并没有说如果它在现有体系结构上起作用,它可以重新编译并在一些新的体系结构上起作用。

您正在查看的文件,arch/arm64/include/asm/unistd32.h,是arm32兼容模式的系统调用定义

本机aarch64的系统调用定义来自通用系统调用表,您可以看到该表未定义_NR_open。系统调用未被删除-它从未在aarch64上存在

在泛型表中没有定义_NR_open的原因是openat2系统调用是后来引入的,并且是_NR_open功能的严格超集,因此 在openat2引入后创建的新体系结构端口中没有一点提供了系统调用,这是冗余的。POSIX open函数由用户空间C库提供,调用openat2系统调用

openat2之前存在的旧体系结构端口(如x86和arm32)必须继续包括open2,因为调用open2系统调用的体系结构肯定存在旧程序/库二进制文件。这种担心不适用于新的体系结构端口——打破用户空间的保证是,如果它昨天起作用,它今天就会起作用,但它并没有说如果它在现有体系结构上起作用,它可以重新编译并在一些新的体系结构上起作用