【问题标题】:how to know if cpu is running in 64 bit in linux? [duplicate]如何知道 cpu 在 linux 中是否以 64 位运行? [复制]
【发布时间】:2013-11-29 19:36:56
【问题描述】:

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

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 */
}

【问题讨论】:

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


    【解决方案1】:

    使用 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

    【讨论】:

    • 是的,但是问题是关于检查 CPU 而不是内核。
    • @Zegar 他想知道它的 linux “是否在 64 位模式下运行。”。如果它的系统可以在 64 位模式下运行,则不会。
    • 好吧,据我了解,他询问了I'm looking for a way to know if the cpu of my linux system is running in 64 bit mode.,但没关系。当他可以从我们的两个答案中进行选择时会更好:-)
    • @Zegar 我认为我们的解决方案是互补的:)。
    【解决方案2】:

    如果您想确定 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

    【讨论】:

    • 我想知道:如果 64 位 CPU 在 32 位内核上运行,标志会保持不变吗?
    • 好吧,我不太确定,但我想它们会保持不变。 lshw 似乎也是一个合适的工具。
    • 我有点困惑,“宽度:64 位”在您的 32 位内核示例中是什么意思?处理器是 64 位的,但功能只有 32 位?
    • Width 正好是特定设备(logicalcpu)的地址宽度。
    • 如果他们向您发送另一个函数的参数,您能注意到该参数是 CPU 运行在 64 位还是 32 位?
    猜你喜欢
    • 2017-06-23
    • 2012-07-17
    • 2015-02-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多