Определите тип / архитектуру процессора в macOS - PullRequest
1 голос
/ 02 августа 2020

В готовящемся к выпуску оборудовании Apple Silicon некоторые приложения могут захотеть определить, какой процессор - 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 Bioni c », чем« процессор Apple ».

Быстрый поиск« Apple A12Z Bioni c »на системном томе показывает, что он находится где-то в« dyld_shared_cache_arm64e », но не внутри System Profiler.app, что предполагает, что эта строка доставляется функцией фреймворка, а не жестко закодирована в приложении Profiler. Поэтому я надеюсь найти системный вызов, который дает это более информативное имя.

Ответы [ 2 ]

1 голос
/ 22 августа 2020

мои два цента за swift 5.x (проверено в Ma c, 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
    }
}
0 голосов
/ 06 августа 2020

Как следует из комментариев, функцию sysctl можно использовать для определения типа процессора (но не для доставки текста «Apple A12Z Bioni c», который я ищу).

Вот пример кода:

#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 Ma c и 0x0100000c на Apple Silicon DTK (начиная с BigSur beta 3).

01 в старший байт - это флаг, указывающий на 64-битную систему ARM. Определено в 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 (Ohanaware)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...