偏离常态有什么好处?对于 64 位架构来说,用户空间和内核空间中的 64 位指针都是 64 位指针吗?
答案1
兼容性。
首先,请注意,Sun 的 64 位支持可以追溯到 1998 年的 Solaris 7,远远早于 AMD64 甚至 Itanium 获得操作系统支持。通过在用户空间中同时支持 32 位和 64 位,您可以让绝大多数软件完全不变地运行。
查看Solaris 64 位开发人员指南(2005 年)。首先,它指出实际上有两个独立的系统:
Solaris 操作环境同时支持两个一流的 ABI。换句话说,两个独立的、功能齐全的系统调用路径连接到 64 位内核。两组库支持应用程序。
然后反复强调,如果您有良好的旧 C 代码(假设它是 32 位),它就会工作得很好 - 即使继续构建得很好,就好像什么都没有改变一样:
正如跨越 4 GB 障碍中所讨论的,大多数 32 位应用程序在 Solaris 64 位操作环境中运行时无需更改。
...
32 位应用程序保持了源代码级兼容性。对于 64 位应用程序,所做的主要更改是针对应用程序编程接口中使用的派生类型。
成功的技术转型通常伴随着古怪的混合体和嵌合体,有时它们的用途已经过时了。
答案2
回答修改后的问题:为什么Linux在sparc64架构上,在用户空间中使用32位指针,在内核空间中使用64位指针?
这样做可能是为了减少二进制代码的大小和运行时间,因为指针使用内存大小的一半,同时保留 64 位模式的其他优点。当然,缺点是虚拟内存大小限制为 4 GB,但七年前的问题比现在还小。
在 AMD64(又名 x86_64)架构上,64 位模式下的 32 位指针是一个正在进行的项目:X32 System V 应用程序二进制接口。人们对该处理器系列的兴趣更高,因为在 64 位模式下您还拥有更多可用寄存器,并使用它们而不是内存加速应用程序。
答案3
根据您发布链接的文档,Solaris x86_64 架构确实不是在用户空间中使用 32 位指针,在内核空间中使用 64 位指针。
无论如何,该文档要么不正确,要么不完整/没有解释使用哪个 Solaris 版本以及使用哪个编译器版本和选项,要么只是不适用于 Solaris,而是适用于 Linux(它指出通过在不同的 Linux 计算机上运行该程序来证明)。
这俩32 位 (ILP32) 和 64 位 (LP64) 型号无论使用哪种 64 位 CPU 体系结构(x86_64 或 UltraSPARC/SPARC64),Solaris 10 及更高版本都支持这些指针,并且 64 位模型中没有 32 位指针。有关详细信息,请查看Solaris 64 位开发人员指南。
在 SPARC 上,Solaris 从 2.7 (1998) 开始支持 64 位二进制文件/指针。