为什么我的系统说有 32 位 cpu?

为什么我的系统说有 32 位 cpu?

执行时:

$ cat /sys/devices/system/cpu/modalias;
cpu:type:x86,ven0002fam0019mod0021:feature:,0000,

说有一个 32 位 cpu,但有一个 ryzen 7 5800X3D,是 64 位 cpu,会发生什么?

$ cat /proc/cpuinfo | grep Ryzen | head -n 1
model name  : AMD Ryzen 7 5800X3D 8-Core Processor
$ uname -i
x86_64

modalias文件不是cpu架构的表示吗?

答案1

cpu/modalias您展示:

cpu:type:x86,ven0002fam0019mod0021:feature:[FEATURE LIST]

x86在这种情况下并不意味着 32 位,而是它是x86指令集架构同时拥有 Intel 和 AMD 的家族。 x86 架构有 16 位、32 位和 64 位。

它进一步说(在 中“翻译” /proc/cpuinfo):

内核使用CPUID指令(特定于 x86)从 CPU 获取功能列表。 (本文展示了如何使用汇编来完成此操作)。

您对长模式 (LM) 感兴趣,该模式0x003D在功能列表中由 61 ( ) 标识。

做了一个粗略的脚本来通过解析列出功能文件cpufeatures.h来自内核源代码:

#! /bin/bash -

# Hash-like map with features from cpufeatures.h
# An ugly and likely unreliable sed parse :P

# https://github.com/torvalds/linux/blob/10d4879f9ef01cc6190fafe4257d06f375bab92c/arch/x86/include/asm/cpufeatures.h
declare -A features=()
while IFS=$'\t' read -r a b c; do
    a=$((a))
    x=$(printf "%04X" $a)
    features[$x]="$(printf "%s %3d\t%-24s\t%s" "$x" "$a" "$b" "$c")"
done< <(sed -n '
s;^#define X86_FEATURE_\([^ ]\+\)\s\+(\([^)]\+\)) /\*\(.*\) \*/$;\2\t\1\t\3;p' \
    cpufeatures.h)

# Give any argument to script to print all
# possible features defined in cpufeatures.h:
if [ $# = 1 ]; then
    printf 'cpufeatures:\n'
    printf '%s\n' "${features[@]}" | sort
    printf '\n'
fi

# Print all features from system's CPU.
# Unknown are denoted by * (N/A)
printf '/sys/devices/system/cpu/modalias features:\n'
while IFS= read -r feature; do
    ent=${features[$feature]}
    if [ -z "$ent" ]; then
        printf '%s %3d*\t(N/A)\n' "$feature" "$((0x$feature))"
    else
        printf '%s\n' "$ent"
    fi
done< <(sed 's/^.*feature:,\?\(.*\),\?$/\1/;s/,/\n/g' \
    /sys/devices/system/cpu/modalias | sort)

为您提供完整列表,例如:

/sys/devices/system/cpu/modalias features:
0000   0    FPU                          Onboard FPU
0001   1    VME                          Virtual Mode Extensions
0002   2    DE                           Debugging Extensions
0003   3    PSE                          Page Size Extensions
0004   4    TSC                          Time Stamp Counter
0005   5    MSR                          Model-Specific Registers
0006   6    PAE                          Physical Address Extensions
0007   7    MCE                          Machine Check Exception
0008   8    CX8                          CMPXCHG8 instruction
0009   9    APIC                         Onboard APIC
000B  11    SEP                          SYSENTER/SYSEXIT
000C  12    MTRR                         Memory Type Range Registers
000D  13    PGE                          Page Global Enable
000E  14    MCA                          Machine Check Architecture
... and so on

例如,检查长模式应该为您提供:

 ./cpufeatures | grep Long
003D  61    LM                           Long Mode (x86-64, 64-bit support)

该列表应与flags中的部分相同/proc/cpuinfo

答案2

您似乎误解了信息外观这里

您正在寻找的是标志:lm。它代表X86_FEATURE_LM,长模式(64 位)支持。如果您可以在 CPU 标志中找到“lm”标志,则意味着您正在查看 64 位有能力的处理器。

这里的关键词是有能力的。

答案3

x86_64维基百科)在您的问题中已被识别为 64 位。

相关内容