如何知道cpu是否在linux中以64位运行?

时间:2013-11-16 10:51:15

标签: function linux-kernel cpu 32bit-64bit generic-programming

我正在寻找一种方法来了解我的linux系统的cpu是否在64位模式下运行。我必须为大学编程。我的想法是创建类似于向我提供信息的功能。我不知道该如何开始。有人可以给我一个想法吗?我的大学给了我一个代码,但是我无法检查主要发送给funktion的参数的长度是64位。 我的代码是这样的:

int main()
{

    uint32_t msr = assembleMSR( 0, 0, 0, 0 );

    printf("assembled MSR is %#x, should be 0\n", msr);
    printf("is64BitMode(&msr) should be 0, is %d\n", is64BitMode(&msr));
    printf("is64BitMode(&msr) should my EXAMPLE, is %d\n", is64BitMode(&msr2));

    enableInts( &msr);

    printf("MSR with ints enabled is %#x, should be 0x8000\n", msr);

    return 0;
}

int is64BitMode ( uint32_t *MSR ) {

    int longi=sizeof(MSR);  

    printf("longi de size of%d\n", longi);
    printf("%d\n", __WORDSIZE);// with this sentence i know that my cpu is running on 64 bits.


    (void) MSR;
    return 0;
    /* TODO */
}

2 个答案:

答案 0 :(得分:0)

如果您想确定CPU的可能性:

使用:

$ grep flags /proc/cpuinfo

然后你会观察结果:

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm

如果存在标志lm,则表示长模式CPU - 64位CPU。

或者您可以使用命令:

lshw

它会在32位内核上产生清晰的结果,例如:

# 32-bit Kernel
$ lshw -class cpu
  *-cpu:0
   description: CPU
   product: Intel(R) Core(TM)2 CPU          4300  @ 1.80GHz
   vendor: Intel Corp.
   physical id: 400
   bus info: cpu@0
   version: 6.15.2
   serial: 0000-06F2-0000-0000-0000-0000
   slot: Microprocessor
   size: 1800MHz
   width: 64 bits
   clock: 800MHz
   capabilities: boot fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe x86-64 constant_tsc pni monitor ds_cpl est tm2 ssse3 cx16 xtpr lahf_lm
   configuration: id=1
 *-logicalcpu:0
      description: Logical CPU
      physical id: 1.1
      width: 64 bits
      capabilities: logical
 *-logicalcpu:1
      description: Logical CPU
      physical id: 1.2
      width: 64 bits
      capabilities: logical

在64位内核上,例如:

# 64-bit Kernel
  *-cpu                   
   description: CPU
   product: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz
   vendor: Intel Corp.
   physical id: 6
   bus info: cpu@0
   version: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz
   slot: None
   size: 1199MHz
   capacity: 1199MHz
   width: 64 bits
   clock: 133MHz
   capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp x86-64 constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt aes lahf_lm ida arat tpr_shadow vnmi flexpriority ept vpid cpufreq
   configuration: cores=2 enabledcores=2 threads=4

如果要确定内核属性:

使用Maxime的solution并使用uname -mlscpu

答案 1 :(得分:0)

使用uname:

您可以使用uname检查处理器是否为64位:

uname -m

我系统上的示例:

x86_64

使用选项-r,您可以检查内核是32位还是64位:

 % uname -r
 3.2.0-4-amd64

使用lscpu:

您将能够知道支持的模式,但不知道使用的模式:

% lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...

其他解决方案:

正如Zegar在his answer中建议的那样,您也可以使用grep flags /proc/cpuinfo并查找lm标记。或者使用lshw