问题标签 [linux-x32-abi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 在 Linux x32 ABI 中,哪些小于 4GB 的工作负载的性能会比 x64 差?
有一个相对较新的 Linux ABI 称为 x32,其中 x86-64 处理器以 32 位模式运行,因此指针仍然只有 32 位,但仍然使用 64 位架构特定的寄存器。因此,与普通 32 位一样,您的最大内存使用量仍被限制为 4GB,但您的指针使用的缓存空间比 64 位少,您可以有效地执行 64 位算术,并且您可以访问更多寄存器(16) 比普通 32 位 (8) 中的要好。
假设您的工作负载非常适合 4GB,那么 x32 的性能是否会比 x86-64 差?
在我看来,如果您不需要额外的内存空间,则不会丢失任何东西——您应该始终获得相同的性能(当您已经适合缓存时)或更好(当节省的指针空间让您更适合缓存时) . 但如果有分页/TLB/等,我不会感到惊讶。我不知道的细节。
32bit-64bit - x32 ABI 是这个工具,如何使用它
我需要提高 32 位应用程序的性能,所以我想转向 64 位以提高性能。但我开始了解 x32abi
下面我有一些信息链接只是我想知道这是一个工具还是它是什么
如何使用它我对链接感到困惑
https://sites.google.com/site/x32abi/ 在此处输入链接描述
linux - 必须重新编译哪些内容才能运行 x32 ABI 应用程序?
我可以使用新的 x32 ABI 编译应用程序,然后在普通内核中运行它吗?运行时 C 库呢?与预编译的 x86/x86_64 库有任何形式的互操作性吗?
c - 64 位可执行文件的运行速度比 32 位版本慢
我有一个 64 位 Ubuntu 13.04 系统。我很想知道 32 位应用程序如何在 64 位系统上针对 64 位应用程序执行,因此我将以下 C 程序编译为 32 位和 64 位可执行文件,并记录它们执行的时间。我使用 gcc 标志为 3 种不同的架构进行编译:
-m32
:Intel 80386 架构(int、long、指针全部设置为 32 位(ILP32))-m64
: AMD 的 x86-64 架构 (int 32 bits; long, pointer 64 bits (LP64))-mx32
:AMD 的 x86-64 架构(int、long、指针都设置为 32 位(ILP32),但 CPU 处于 long 模式,有 16 个 64b 寄存器,并且寄存器调用 ABI)
我用来获取不同可执行文件的命令:
这是我得到的结果:
为什么 64 位版本的运行速度比 32 位版本慢?我读到,与 32 位架构相比,64 位架构改进了指令集和两倍的通用寄存器,从而实现了更多优化。我什么时候可以在 64 位系统上获得更好的性能?
编辑
我使用标志打开了优化-O3
,现在结果是:
c - 如何在预处理器中检测 X32 ABI 或环境?
X32
是使用 32 位指针的amd64
/ CPU的 ABI 。x86_64
这个想法是将更大的 x86_64 寄存器集与由 32 位指针产生的更小的内存和缓存占用空间相结合。它提供了大约 40% 的加速。有关详细信息并将其设置为 chroot 环境,请参阅Stack Overflow 上的x86、x32 和 x64 架构之间的差异,以及 Debian X32 端口wiki 页面。
我们收到了来自环境下 Debian 维护者的错误报告。报告是adcq
非法指令。内联汇编是根据预处理器宏激活的,所以我们没有正确检测 X32(或者更正确,直到现在才检测到)。
预处理器宏最明显的选择(对我来说)是类似__X32__
的,但没有提供。根据Clang 的补丁和Debian 的建议,看起来__ILP32__
可以使用。但我想要一个更规范的答案,_ILP32
而且__code_model_small__
看起来也很有趣。(而且我知道 SSE2 存在问题,编译器支持它但操作系统不支持)。
在使用 Clang 和 GCC 时,可以使用哪些预处理器宏来可靠地检测 X32 ABI 和环境?
需要明确的是,我此时并不想修复代码。我只想知道可以在完整修复中使用的宏。
windows - 如何在 Windows 上检测 X32?
X32 允许使用在 x86_64 处理器上运行的 32 位整数、长整数和指针来编写程序。在某些用例下,使用 X32 有很多好处。(X32 与 X86 或 X64 不同;有关详细信息,请参阅x86、x32 和 x64 架构之间的差异)。
似乎某些 Windows Enterprise Server 支持 X32,但我无法找到有关它的更多信息。这基于一些英特尔 PDF,例如面向智能系统的基于英特尔® 至强® 处理器 E5-2400 系列的平台:
微软关于预定义宏的文档列出了常见的可疑对象,例如_M_X64
和_M_AMD64
. 但它似乎没有讨论 X32 的架构选项。
如果 Microsoft 支持 X32,那么我怀疑这将是一个类似于大地址空间感知或终端服务感知的选项。
Microsoft 是否真的支持 X32(相对于 X86 和 X64)?
- 如果是这样,我如何确定何时在 Windows 下选择了 X32?
- 如果不是,那么英特尔为什么要专门为 Windows 调用 X32 平台呢?
gcc - 执行“emms”MMX 指令时出现总线错误
我正在开发一些带有内联汇编的软件的端口,因为我们从X32下的 Debian 维护者那里获取了一些错误报告。该代码在 X86 和 X64 下都很好。
我们在emms
指令中发现了一个总线错误:
根据手册,会引发以下异常:
这是 MMX 状态寄存器中使用的掩码:
我不相信我可以访问控制寄存器来确定实际导致异常的原因,因此我无法定位总线错误的原因。
总线错误的一些潜在原因是什么?或者我该如何进一步解决这个问题?
这是info float
:
这是来自info registers
:
这是 MMX 状态寄存器位的细分:
linux - 无法将共享库与 -mx32 和 gcc 4.7 或 gcc 4.8 链接
我正在尝试编译为 32 位嵌入式处理器编写的大型代码库,以便在 64 位桌面处理器上运行以进行模拟/单元测试。我需要生成的对象是一个共享库。这在 Windows 中不是问题,我可以构建这样的 dll (/DWIN32) 并且运行良好。
在 Linux 中,我可以使用 gcc 和链接器的 -m32 选项进行编译和链接,并获得一个共享库。问题是,这个库(就像我用 -m32 指定的一样)是一个 32 位库,不会在我的 64 位拱上运行。使用 Python,我尝试加载库(使用 ctypes.cdll.LoadLibrary())
我发现了 -mx32 选项,根据文档,这正是我想要的:
-mx32 选项将 int、long 和指针类型设置为 32 位,并为 x86-64 体系结构生成代码。
因此,我将 -mx32 传递给编译器和链接器(替换我的 -m32 选项)并获得以下内容(截断输出):
我使用 gcc 4.7 和 gcc 4.8 得到相同的结果。以上输出来自 gcc 4.8。
我安装了 gcc-4.8-multilib 和 g++-4.8-multilib。
我的图书馆路径是:
从 .bashrc 我已经像这样指定它(如下),在阅读链接器只会与有效的库绑定后绝望地添加 /4.8/ 和 /4.8/32/ 东西。
正如我所提到的,这在 Windows 上作为 dll 已经很好地工作了,我不得不相信我只是错过了一些东西。指针应该是 32 位,长应该是 32 位,整个事情应该在 x86_64 上运行。-mx32 说它会这样做(对吗?)。
在 -m32 中编译后检查其中一个对象:
并在使用 -mx32 编译后检查相同的对象:
我会以错误的方式解决这个问题吗?我还能使用带有某种兼容层的 32 位共享库吗?
我看到了一份针对 gcc 4.7 的关于这些链接错误的错误报告……但我没有从中看到太多的结论。 这个页面说 gcc 4.8 是 x32 的推荐最低版本,所以我安装了它。仍然-我无法链接。-m32 链接正常。
assembly - 错误:没有此 cpu 级别的指令(或者,强制 REX 前缀)
我正在研究一个X32 目标文件,它使用 32 位整数、长整数和指针。我正在像这样构建目标文件:
rdrand.S
是多平台(X86、X32 和 X64)。在 X86 块中,可以使用 64 位寄存器。所以我正在尝试(省略其他代码来演示核心问题):
但是,似乎 NASM没有在指令上发出 REX 前缀,因此导致:
我知道 rdrand rax
会起作用,所以它的问题是让 NASM 发出 REX 前缀。(我不确定mov [buffer], rax
,但一旦我弄清楚 REX 问题,我就会解决这个问题)。
我如何告诉 NASM 发布广泛版本的指令?
我正在使用 Debian 的 NASM 版本:
但是,我目前不在启用 X32 的内核中。
macos - __ILP32__ 和 __i386__ 是有效配置吗?
我们针对 OS X 上 Clang 下的一些 X32 代码进行了错误报告(错误如下所示)。用户尝试在 Intel x86_64 系统上使用-arch i386
. X32 是 32 位整数、长整数和指针。
根据System V Application Binary Interface, AMD64 (With LP64 and ILP32 Programming Models) (page 104),有效的配置要么__ILP32__
单独,要么__ILP32__
和__x86_64__
(和朋友一样amd64
,代替__x86_64__
)。
我还查了SYSTEM V APPLICATION BINARY INTERFACE for Intel386,也没有提到__ILP32__
和朋友。所以我认为不__ILP32__
应该出现在纯 32 位系统上。
我认为以上内容应该足以回答这个问题,但我在 OS X 系统上使用 Clang。OS X ABI 函数调用指南没有讨论它,并且经常遵循 System V 指南。但是,引用的 System V 指南来自 2003 年,早于 X32,因此没有处理。
我的问题是,是__ILP32__
和__i386__
一个有效的组合或配置?
为了完整起见,这里是代码和编译器错误。我不是试图解决这个问题。
源代码
BOOL_X32
在环境中定义时__ILP32__
定义。
编译器错误
X32主要是32 位的。但是,当使用汇编语言与堆栈交互时,我们需要推送/弹出 64 位寄存器和值。
-arch i386
最后,这是在 x86_64 系统上使用时 Clang 的预处理器宏: