3

随着即将推出的 Apple Silicon 硬件,一些应用程序可能想要确定 CPU 是 Intel 还是 Apple 的。

哪些 API 和系统调用可以提供该信息?

正如@MarkSetchell指出的那样sysctl -a可以提供一些信息。对于 DTK (macOS 11b3),它返回:

machdep.cpu.brand_string: Apple processor

OTOH,Apple 的System Profiler.app节目:

Processor Name: Apple A12Z Bionic

我喜欢有类似的结果,即“Apple A12Z Bionic”而不是“Apple 处理器”。

在系统卷上快速搜索“Apple A12Z Bionic”显示它出现在“dyld_shared_cache_arm64e”中的某个位置,但不在内部System Profiler.app,这表明该字符串是由框架函数提供的,而不是在 Profiler 应用程序中硬编码。因此,我希望找到提供这个更具描述性名称的系统调用。

4

2 回答 2

5

swift 5.x 我的两分钱(在 Mac、iOS 和....(NDA 规则..)中测试)

func CPUType() ->Int {
    
    var cputype = UInt32(0)
    var size = cputype.byteWidth
    
    let result = sysctlbyname("hw.cputype", &cputype, &size, nil, 0)
    if result == -1 {
        if (errno == ENOENT){
            return 0
        }
        return -1
    }
    return Int(cputype)
}


let CPU_ARCH_MASK          = 0xff      // mask for architecture bits

let CPU_TYPE_X86           = cpu_type_t(7)
let CPU_TYPE_ARM           = cpu_type_t(12)

func CPUType() ->String {
    
    let type: Int = CPUType()
    if type == -1 {
        return "error in CPU type"
    }
    
    let cpu_arch            = type & CPU_ARCH_MASK
    
    if cpu_arch == CPU_TYPE_X86{
        return "X86"
    }
    
    if cpu_arch == CPU_TYPE_ARM{
        return "ARM"
    }
    
    return "unknown"
}

// 附件 f.:

extension FixedWidthInteger {
    var byteWidth:Int {
        return self.bitWidth/UInt8.bitWidth
    }
    static var byteWidth:Int {
        return Self.bitWidth/UInt8.bitWidth
    }
}
于 2020-08-22T18:35:00.977 回答
1

正如评论所暗示的,该sysctl功能可用于识别 CPU 类型(但不提供我正在寻找的“Apple A12Z Bionic”文本)。

这是一个代码示例:

#include <stdio.h>
#include <sys/sysctl.h>

int main(int argc, const char * argv[]) {
    uint32_t cputype = 0;
    size_t size = sizeof (cputype);
    int res = sysctlbyname ("hw.cputype", &cputype, &size, NULL, 0);
    if (res) {
        printf ("error: %d\n", res);
    } else {
        printf ("cputype: 0x%08x\n", cputype);
    }
    return 0;
}

这可以0x00000007在 Intel Mac 和0x0100000cApple Silicon DTK(从 BigSur beta 3 开始)上打印。

最高有效字节中的01一个标志表示 ARM 64 位系统。定义在machine.h

#define CPU_ARCH_MASK           0xff000000      /* mask for architecture bits */
#define CPU_ARCH_ABI64          0x01000000      /* 64 bit ABI */
#define CPU_ARCH_ABI64_32       0x02000000      /* ABI for 64-bit hardware with 32-bit types; LP32 */

#define CPU_TYPE_X86            ((cpu_type_t) 7)
#define CPU_TYPE_ARM            ((cpu_type_t) 12)
#define CPU_TYPE_ARM64          (CPU_TYPE_ARM | CPU_ARCH_ABI64)
#define CPU_TYPE_ARM64_32       (CPU_TYPE_ARM | CPU_ARCH_ABI64_32)

另请参阅:macOS CPU 架构(Ohanaware)

于 2020-08-06T09:55:37.867 回答