Vous devez consulter les API IOKit. L'application IORegistryExplorer (qui fait partie de l'installation standard de devtools) vous aidera à trouver ce que vous cherchez. Par exemple, sur mon MacBook Pro, dans IORegistryExplorer, je sélectionne 'IODeviceTree' dans le menu déroulant en haut à gauche de la fenêtre, et je vois deux processeurs dans l'arborescence ci-dessous. La sélection de l'un me reçoit les informations suivantes:
IORegistryExplorer screenshot http://blog.alanquatermain.net/images/IORegistryExplorer-CPUs.png
« bus-fréquence » et « fréquence d'horloge » et « base de temps-fréquence » sont wrapper tous les entiers 32 bits dans les objets de données, et doivent donc être byte-troqué à interpréter ici (little-endian mots machine i386) et travailler aux valeurs suivantes:
- bus fréquence: 1064000000 Hz => 1,064 GHz
- horloge de fréquence: 2530000000 Hz = > 2,53 GHz
- fréquence base de temps: 1000000000 HZ => 1,0 GHz
Si vous lisez ces via IOKit cependant, vous récupérerez un CFDataRef, et peut tout simplement copier les octets dans votre propre uint32_t comme ceci:
uint32_t bus_frequency = 0;
CFDataGetBytes(theData, (UInt8 *) &bus_frequency, sizeof(uint32_t));
Ensuite, vous pouvez obtenir des informations sur le processeur en utilisant l'appel NXArchInfo()
obtenu en incluant <mach-o/arch.h>
. Cela renverra une structure contenant des codes de type et de sous-type de cpu ainsi que des noms et des descriptions de chaînes de caractères.Si cela n'inclut pas d'identifiant pas à pas, la seule façon de penser à cela (de haut en bas) est via l'instruction CPUID. Créer un .s et .h, et mettre dans le code suivant:
fichier .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__ */
S'il vous plaît noter que je ne suis pas certain à propos du bit x86_64 ci-dessus; en théorie, ce que j'ai tapé ici assurera que le même code compile pour 64 bits, et retournera une valeur de 64 bits dans ce cas. Il va également sauvegarder/restaurer le registre% rbx, la version 64 bits du registre% ebx. Théoriquement qui couvrira toutes les bases.
Si quelqu'un a la réponse, il devrait probablement être ajouté au lien "lié" ... – dmckee