Вам нужно взглянуть на API IOKit. Приложение IORegistryExplorer (часть стандартной установки devtools) поможет вам найти то, что вы ищете.
Например, на моем MacBook Pro в IORegistryExplorer я выбираю «IODeviceTree» из раскрывающегося списка в верхнем левом углу окна, и я вижу два ЦП в древовидном представлении ниже. Выбор любого из них дает мне следующую информацию:
IORegistryExplorer screenshot http://blog.alanquatermain.net/images/IORegistryExplorer-CPUs.png
«шина-частота», «частота-частота» и «частота-база» - это все 32-битные целочисленные обертки в объектах данных, и поэтому для их интерпретации они должны быть заменены байтами (машинные слова в младшем порядке) и определите следующие значения:
- частота шины: 1064000000 Гц => 1,064 ГГц
- тактовая частота: 2530000000 Гц => 2,53 ГГц
- частота: 1000000000 Гц => 1,0 ГГц
Однако, если вы читаете их через IOKit, вы получите CFDataRef и можете просто скопировать байты в свой собственный uint32_t, например:
uint32_t bus_frequency = 0;
CFDataGetBytes( theData, (UInt8 *) &bus_frequency, sizeof(uint32_t) );
Далее вы можете получить информацию о процессоре, используя вызов NXArchInfo()
, полученный путем включения <mach-o/arch.h>
. Это вернет структуру, содержащую коды типов и подтипов процессора, а также имена и описания C-строк. Если это не включает в себя пошаговый идентификатор, единственный способ, которым я могу придумать, чтобы получить это (от макушки головы), - через инструкцию CPUID. Создайте файл .s и .h и введите следующий код:
.s файл:
#ifdef __i386__ || __x86_64__
.macro ENTRY
.text
.private_extern $0
.align 4, 0x90
$0:
.endmacro
// __private_extern__ unsigned long GetCPUSteppingID( void )
ENTRY _GetCPUSteppingID
push %ebp // store existing frame pointer
mov %esp,%ebp // make a new frame pointer from stack pointer
#if __x86_64__
push %rbx
#endif
push %ebx // we save %ebx because the cpuid instruction
// will overwrite it, and it's expected
// to be unchanged in the caller after
// calling another function
movl $1,%eax // fetch cpu info
cpuid // stepping-id is in low 4 bits of %edx now
and $0x0000000f,%edx // clear out everything we don't want
#if __x86_64__
mov %edx,%rax // %rax is 64-bit arch result register
#else
mov %edx,%eax // %eax is 32-bit arch result register
#endif
pop %ebx // restore saved value of %ebx
#if __x86_64__
pop %rbx // restore saved value of %rbx
#endif
leave // restores prior stack frame from %ebp
ret // returns to caller
#endif // __i386__ || __x86_64__
.h файл:
#ifndef __GET_STEPPING_ID__
#define __GET_STEPPING_ID__
/* unsigned long is register-sized on both 32-bit and 64-bit OS X */
__private_extern__ unsigned long GetSteppingID( void );
#endif /* __GET_STEPPING_ID__ */
Обратите внимание, что я не уверен насчет бита x86_64 выше; теоретически то, что я там напечатал, гарантирует, что тот же код компилируется для 64-битной версии, и в этом случае вернет 64-битную величину. Это также сохранит / восстановит регистр% rbx, 64-битную версию регистра% ebx. Теоретически , который будет охватывать все базы.