gpt4 book ai didi

xcode - 如何在 Mac 框架中调用 cpuid 指令?

转载 作者:行者123 更新时间:2023-12-04 21:20:45 26 4
gpt4 key购买 nike

我想使用 cpuid 指令来识别 Intel CPU 的功能。我在 Kernel.framework 中找到了 cpuid.h 头文件,因此我将 Kernel.framework 添加到我的项目中并包含 <Kernel/i386/cpuid.h>在我的源文件中。那产生了

kern/kern_types.h: No such file or directory

我不明白。但是函数 do_cpuid ,这是我想我想使用的,是内联定义的,所以我试着把它复制到我的源代码中。
static inline void
do_cpuid(uint32_t selector, uint32_t *data)
{
asm("cpuid"
: "=a" (data[0]),
"=b" (data[1]),
"=c" (data[2]),
"=d" (data[3])
: "a"(selector));
}

这给了我错误:
error: can't find a register in class 'BREG' while reloading 'asm'
error: 'asm' operand has impossible constraints

谷歌搜索这个错误让我想到了这个问题: Problem on Mac : "Can't find a register in class BREG while reloading asm"

但该问题的解决方案是使用 dynamic-no-pic 选项( GCC_DYNAMIC_NO_PIC build设置),Xcode 对build设置的帮助说“不适用于共享库(需要与位置无关)。”我正在构建一个框架,我认为它算是一个共享库。那么我怎样才能做到这一点呢?

最佳答案

这个相当神秘的错误信息:

error: can't find a register in class 'BREG' while reloading 'asm'
error: 'asm' operand has impossible constraints

正在发生,因为其中一个约束是不允许的。在这种情况下,它是 EBX .使用 -fPIC 编译 32 位代码时选项(位置无关代码) EBX寄存器用于重定位。它不能用作输出或显示为损坏的寄存器。

尽管大多数人建议使用特殊的编译器标志进行编译,但可以通过修改汇编代码以保存 EBX 来重写该函数以支持 x86-64/IA32 和 PIC/非 PIC。注册自己并在之后恢复它。这可以通过以下代码完成:
#include <inttypes.h>

static inline void
do_cpuid(uint32_t selector, uint32_t *data)
{
__asm__ __volatile__ (
"xchg %%ebx, %k[tempreg]\n\t"
"cpuid\n\t"
"xchg %%ebx, %k[tempreg]\n"
: "=a" (data[0]),
[tempreg]"=&r" (data[1]),
"=c" (data[2]),
"=d" (data[3])
: "a"(selector),
"c"(0));
}

显着的变化是 data[1]值将在编译器选择的可用寄存器中返回。 =&r约束告诉编译器它选择的任何寄存器都不能是任何其他输入寄存器(我们早期用 xchg 代码破坏了寄存器)。在我们交换的代码中 EBX使用编译器选择的可用寄存器。然后我们再把它换回来。完成后 EBX将包含其原始值,而选择的空闲寄存器将包含 CPUID 返回的内容。 .汇编器模板然后将该空闲寄存器的内容移动到 data[1] .

通过允许编译器选择一个空闲寄存器,我们有效地规避了这个问题。编译器足够聪明,不使用 EBX如果它被捆绑,因为它可能用于可重定位代码。在 64 位代码中 EBX不像 32 位代码那样用于重定位,因此它可能可供使用。

精明的观察者可能已经注意到 xor %%ecx,%%ecx .这是我独立于 EBX 所做的更改问题。现在被认为是清除 ECX 的好习惯。因为如果 ECX,AMD 制造的某些处理器可能会返回旧值不为零。如果您仅针对非 PPC Mac 平台进行开发,则无需进行此更改,因为 Apple 使用的英特尔处理器不会表现出此类行为。

一般 EBX在 32 位可重定位/PIC 代码中是特殊的,这就是编译器最初提示其神秘消息的原因。

关于xcode - 如何在 Mac 框架中调用 cpuid 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12221646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com