2010-08-31 17 views
5

Sé que puedo usar el terminal y el comando system-profiler para determinar la bitness actual del kernel, pero estoy tratando de determinar si hay una manera de obtener esa misma información programáticamente en objective-c.¿Cómo se determina la bitness del kernel en Mac OS X 10.6?

He revisado la gestalt de Carbon, pero no he visto nada que me diga la fragilidad del kernel.

¿Alguien tiene alguna sugerencia sobre cómo podría hacer esto? Necesito esta información para un informe de depuración que proporciona una instantánea del sistema en el momento del informe.

Gracias!

Actualización: Una cosa que he intentado que sea un truco que aprendí del mundo de Windows es comprobar el tamaño de un int como:

sizeof(int*); //(4 = x86 8 = x64) 

pero no creo que esta es una resolución porque Creo que esto solo me dará una idea de en qué se está ejecutando el programa real y no el núcleo del sistema operativo real. Según tengo entendido, aunque el kernel del sistema operativo se ejecuta en 32 bits, su programa aún se puede ejecutar a 64 bits.

Me encontré con otro foro publicación similar a esta, pero ninguno de ellos parece venir con una respuesta que no sea el uso de system_profiler.

Respuesta

2

Ver man 3 uname: Se llena una estructura utsname que incluye un miembro de machine, que es "x86_64" o "i386" en plataformas Intel:

struct utsname un; 
int res = uname(&un); 
if (res >= 0) { 
    NSLog(@"%s", un.machine); 
} 
+0

Gracias Georg, Intenté su ejemplo pero no pude hacerlo funcionar. Estoy seguro de que es un PEBKAP de mi parte, pero no logro que reconozca el nombre de la estructura. Mi sensación es que esto solo me daría una idea del tipo de CPU donde lo que estoy buscando es la bitness real del kernel actual del sistema operativo, no la capacidad de la CPU. –

+0

@user: use 'struct utsname un;' - todavía estoy pensando a menudo en C++ en ese sentido. Y esto le proporciona el tipo de máquina para la que se creó el núcleo, que es lo que está buscando. –

+0

Georg, ¡Lo tengo funcionando y usted es el ganador que me da la información que estoy buscando! ¡Gracias por su ayuda! –

0

Usted debe ser capaz de leer la información de perfil del sistema en la línea de comandos de la siguiente manera:

sys_profile = popen("system_profiler -xml", "r"); 

Véase el ejemplo ProfileSystem en la documentación de Apple para la forma de analizarlo.

Software/Descripción general del software/Kernel and Extensions de 64 bits es probablemente la clave que desea.

+0

Pedro, estoy empezando a pensar que estás en lo correcto. No he podido encontrar otra forma de obtener la información provista por Kernel y Extensiones de 64 bits. –

1

Usted podría utilizar sysctlbyname. Cave alrededor de mach/machine.h para obtener valores posibles.

#include <mach/machine.h> 
#include <sys/sysctl.h> 

void example() 
{ 
    unsigned int cpuType; 
    size_t size = sizeof(cpuType); 
    sysctlbyname("hw.cputype", &cpuType, &size, NULL, 0); 

    bool is64 = cpuType & CPU_ARCH_ABI64; 

    const char *cpu; 

    switch (cpuType) { 
     case CPU_TYPE_X86: 
     cpu = "x86"; 
     break; 
     case CPU_TYPE_X86_64: 
     cpu = "x86_64"; 
     break; 
     case CPU_TYPE_POWERPC: 
     cpu = "ppc"; 
     break; 
     case CPU_TYPE_POWERPC64: 
     cpu = "ppc_64"; 
     break; 
     case CPU_TYPE_SPARC: 
     cpu = "sparc"; 
     break; 
     default: 
     cpu = "unknown"; 
     break; 
    } 
} 
+0

Eric, Intenté configurar el bool de is64 como se describe, pero siempre devuelve falso. Si estoy leyendo el código correctamente, esto solo me dirá si la CPU física tiene capacidad para 64 bits.Lo que realmente me gustaría saber es qué bitness es el núcleo del sistema operativo que se está ejecutando actualmente. ¿Se está ejecutando x86 (el valor predeterminado) o está ejecutando x64? –

Cuestiones relacionadas