/ proc / cpuinfo의 플래그는 무엇을 의미합니까?


212

프로세서에 특정 기능이 있는지 어떻게 알 수 있습니까? (64 비트 명령어 세트, 하드웨어 지원 가상화, 암호화 가속기 등) 파일 /proc/cpuinfo에이 정보가 포함되어 있다는 것을 알고 있습니다 flags. 그러나이 모든 암호 약어는 무엇을 의미합니까?

예를 들어에서에서 추출한 /proc/cpuinfo경우 64 비트 CPU가 있습니까? 하드웨어 가상화가 있습니까?

model name      : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz
…
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 syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 lahf_lm tpr_shadow vnmi flexpriority

답변:


275

x86

32 비트 (일명 i386–i686 및 64 비트 (일명 amd64)) 즉, 워크 스테이션, 랩톱 또는 서버입니다.

FAQ : 나는…

  • 64 비트 (x86_64 / AMD64 / Intel64)? lm
  • 하드웨어 가상화 (VMX / AMD-V)? vmx(인텔), svm(AMD)
  • 가속 AES (AES-NI)? aes
  • TXT (TPM)? smx
  • 하이퍼 바이저 (그와 같이 발표 됨)? hypervisor

다른 기능의 대부분은 컴파일러 또는 커널 작성자에게만 관심이 있습니다.

모든 깃발

전체 목록은 커널 소스의 파일에 arch/x86/include/asm/cpufeatures.h있습니다.

인텔 정의 CPU 기능, CPUID 레벨 0x00000001 (edx)

Intel Advanced Vector Extensions Programming Reference의 Wikipedia 및 표 2-27 도 참조하십시오.

AMD 정의 CPU 기능, CPUID 레벨 0x80000001

Intel Advanced Vector Extensions Programming Reference의 Wikipedia 및 표 2-23 도 참조하십시오.

변환 정의 CPU 기능, CPUID 레벨 0x80860001

  • recovery: 복구 모드의 CPU
  • longrun: 장기 전력 제어
  • lrti: LongRun 테이블 인터페이스

기타 기능, Linux 정의 매핑

  • cxmmx: Cyrix MMX 확장
  • k6_mtrr: AMD K6 비표준 MTRR
  • cyrix_arr: Cyrix ARR (= MTRR)
  • centaur_mcr: Centaur MCR (= MTRR)
  • constant_tsc: TSC가 일정한 속도로 틱
  • up: UP에서 실행되는 SMP 커널
  • art: 상시 실행 타이머
  • arch_perfmon: 인텔 건축 PerfMon
  • pebs: 정확한 이벤트 기반 샘플링
  • bts: 지점 추적 저장소
  • rep_good: rep 마이크로 코드가 잘 작동합니다
  • acc_power: AMD 누적 전력 메커니즘
  • nopl: NOPL (0F 1F) 명령
  • xtopology: CPU 토폴로지 열거 형 확장
  • tsc_reliable: TSC 는 신뢰할 수있는 것으로 알려져 있습니다
  • nonstop_tsc: C 상태에서 TSC 가 중지되지 않음
  • cpuid: CPU에는 CPUID 명령 자체가 있습니다
  • extd_apicid: APICID 확장 (8 비트)
  • amd_dcm: 다중 노드 프로세서
  • aperfmperf: APERFMPERF
  • eagerfpu: 비 게으른 FPU 복원
  • nonstop_tsc_s3: S3 상태에서 TSC 가 중지되지 않음
  • tsc_known_freq: TSC 에 알려진 주파수
  • mce_recovery: CPU에 복구 가능한 시스템 검사가 있습니다

인텔 정의 CPU 기능, CPUID 레벨 0x00000001 (ECX)

Intel Advanced Vector Extensions Programming Reference의 Wikipedia 및 표 2-26 도 참조하십시오.

VIA / Cyrix / Centaur 정의 CPU 기능, CPUID 레벨 0xC0000001

  • rng: 난수 생성기 존재 (xstore)
  • rng_en: 난수 생성기 사용
  • ace: CPU상의 암호화 (xcrypt)
  • ace_en: 온 CPU 암호화 사용
  • ace2: 고급 암호화 엔진 v2
  • ace2_en: ACE v2 사용
  • phe: PadLock 해시 엔진
  • phe_en: PHE 가능
  • pmm: PadLock 몽고메리 멀티 플라이어
  • pmm_en: PMM 사용

보다 확장 된 AMD 플래그 : CPUID 레벨 0x80000001, ecx

  • lahf_lm: Long 모드에서 플래그 (LAHF)에서 AH를로드하고 플래그 (SAHF)에 AH를 저장
  • cmp_legacy: 예인 경우 하이퍼 스레딩이 유효하지 않습니다
  • svm:“보안 가상 머신”: AMD-V
  • extapic: 확장 된 APIC 공간
  • cr8_legacy: 32 비트 모드의 CR8
  • abm: 고급 비트 조작
  • sse4a: SSE-4A
  • misalignsse: 일부 레거시 SSE 명령어가 정렬되지 않은 데이터에서 작동 할 때 일반 보호 예외 (#GP)가 생성되는지 여부를 나타냅니다. CR0 및 정렬 검사 비트에 따라 다름
  • 3dnowprefetch: 3DNow 프리 페치 명령어
  • osvw: OS가 Visible Workaround를 나타내 므로 OS가 프로세서 정오표 주위에서 작동 할 수 있습니다.
  • ibs: 명령 기반 샘플링
  • xop: 확장 AVX 명령어
  • skinit: SKINIT / STGI 지침
  • wdt: 워치 독 타이머
  • lwp: 경량 프로파일 링
  • fma4: 4 개의 피연산자 MAC 명령어
  • tce: 번역 캐시 확장
  • nodeid_msr: NodeId MSR
  • tbm: 후행 비트 조작
  • topoext: 토폴로지 확장 CPUID leafs
  • perfctr_core: 핵심 성능 카운터 확장
  • perfctr_nb: NB 성능 카운터 확장
  • bpext: 데이터 중단 점 확장
  • ptsc: 성능 타임 스탬프 카운터
  • perfctr_l2: L2 성능 카운터 확장
  • mwaitx: MWAIT확장 ( MONITORX/ MWAITX)

보조 플래그 : Linux 정의-다양한 CPUID 수준에 흩어져있는 기능

  • ring3mwait: 링 3 MONITOR / MWAIT
  • cpuid_fault: 인텔 CPUID 오류
  • cpb: AMD 코어 성능 향상
  • epb: IA32_ENERGY_PERF_BIAS 지원
  • cat_l3: 캐시 할당 기술 L3
  • cat_l2: 캐시 할당 기술 L2
  • cdp_l3: 코드 및 데이터 우선 순위 L3
  • invpcid_single: 효과적으로 invpcid그리고CR4.PCIDE=1
  • hw_pstate: AMD HW-PState
  • proc_feedback: AMD ProcFeedbackInterface
  • sme: AMD 보안 메모리 암호화
  • pti: 커널 페이지 테이블 격리 (Kaiser)
  • retpoline: Spectre variant 2 (간접 분기)에 대한 Retpoline 완화
  • retpoline_amd: AMD 레토 폴린 완화
  • intel_ppin: 인텔 프로세서 인벤토리 번호
  • avx512_4vnniw: AVX-512 신경망 지침
  • avx512_4fmaps: AVX-512 곱하기 누산 단정도
  • mba: 메모리 대역폭 할당
  • rsb_ctxsw: 컨텍스트 스위치에서 RSB 채우기

가상화 플래그 : Linux 정의

  • tpr_shadow: 인텔 TPR 섀도
  • vnmi: 인텔 가상 NMI
  • flexpriority: 인텔 FlexPriority
  • ept: 인텔 확장 페이지 테이블
  • vpid: 인텔 가상 프로세서 ID
  • vmmcall: 선호 VMMCALLVMCALL

인텔 정의 CPU 기능, CPUID 레벨 0x00000007 : 0 (ebx)

확장 상태 기능, CPUID 레벨 0x0000000d : 1 (eax)

  • xsaveopt: 최적화 XSAVE
  • xsavec: XSAVEC
  • xgetbv1: XGETBVECX = 1 인 경우
  • xsaves: XSAVES/XRSTORS

인텔 정의 CPU QoS 하위 리프, CPUID 레벨 0x0000000F : 0 (EDX)

  • cqm_llc: LLC QoS

인텔 정의 CPU QoS 하위 리프, CPUID 레벨 0x0000000F : 1 (EDX)

  • cqm_occup_llc: LLC 점유 모니터링
  • cqm_mbm_total: LLC 총 MBM 모니터링
  • cqm_mbm_local: LLC 로컬 MBM 모니터링

AMD 정의 CPU 기능, CPUID 레벨 0x80000008 (ebx)

  • clzero: CLZERO지시
  • irperf: 성능 카운터 폐기 명령
  • xsaveerptr: 항상 FP 오류 포인터 저장 / 복원

열 및 전원 관리 리프, CPUID 레벨 0x00000006 (eax)

  • dtherm(이전 dts) : 디지털 열 센서
  • ida: 인텔 동적 가속
  • arat: 항상 실행중인 APIC 타이머
  • pln: 인텔 전력 제한 알림
  • pts: 인텔 패키지 열 상태
  • hwp: 인텔 하드웨어 P- 상태
  • hwp_notify: HWP 알림
  • hwp_act_window: HWP 활동 창
  • hwp_epp: HWP 에너지 성능 환경 설정
  • hwp_pkg_req: HWP 패키지 수준 요청

AMD SVM 기능 식별, CPUID 레벨 0x8000000a (edx)

  • npt: AMD 중첩 페이지 테이블 지원
  • lbrv: AMD LBR 가상화 지원
  • svm_lock: AMD SVM 잠금 MSR
  • nrip_save: AMD SVM next_rip 저장
  • tsc_scale: AMD TSC 스케일링 지원
  • vmcb_clean: AMD VMCB 클린 비트 지원
  • flushbyasid: AMD flush-by-ASID 지원
  • decodeassists: AMD 디코딩 지원 지원
  • pausefilter: AMD 필터링 된 일시 중지 인터셉트
  • pfthreshold: AMD 일시 중지 필터 임계 값
  • avic: 가상 인터럽트 컨트롤러
  • vmsave_vmload: 가상 VMSAVE VMLOAD
  • vgif: 가상 GIF

인텔 정의 CPU 기능, CPUID 레벨 0x00000007 : 0 (ECX)

  • avx512vbmi: AVX512 벡터 비트 조작 지침
  • umip: 사용자 모드 명령 보호
  • pku: 사용자 공간을위한 보호 키
  • ospke: OS 보호 키 활성화
  • avx512_vbmi2: 추가 AVX512 벡터 비트 조작 지침
  • gfni: Galois Field 새로운 지침
  • vaes: 벡터 AES
  • vpclmulqdq: 캐리리스 곱셈 더블 쿼드 워드
  • avx512_vnni: 벡터 신경망 지침
  • avx512_bitalg: VPOPCNT [B, W] 및 VPSHUF-BITQMB 명령
  • avx512_vpopcntdq: DW / QW 벡터에 대한 POPCNT
  • la57: 5 단계 페이지 테이블
  • rdpid: RDPID 명령

AMD 정의 CPU 기능, CPUID 레벨 0x80000007 (ebx)

  • overflow_recov: MCA 오버 플로우 복구 지원
  • succor: 수정할 수없는 오류 억제 및 복구
  • smca: 확장 가능한 MCA

감지 된 CPU 버그 (Linux 정의)

  • f00f: 인텔 F00F
  • fdiv: CPU FDIV
  • coma: Cyrix 6x86 코마
  • amd_tlb_mmatch: tlb_mmatchAMD 에라 툼 383
  • amd_apic_c1e: apic_c1eAMD 에라 툼 400
  • 11ap: 나쁜 로컬 APIC 일명 11AP
  • fxsave_leak: FXSAVE가 FOP / FIP / FOP 누출
  • clflush_monitor: MONITOR 전에 AAI65, CLFLUSH 필요
  • sysret_ss_attrs: SYSRET는 SS 속성을 수정하지 않습니다
  • espfix: ""16 비트 SS IRET로 ESP / RSP 상위 비트가 손상됨
  • null_seg: 선택기를 널링하면 기본이 유지됩니다.
  • swapgs_fence: GS에서 입력 깊이가없는 SWAPGS
  • monitor: 원격 CPU를 깨우려면 IPI 필요
  • amd_e400: CPU가 Erratum 400의 영향을 받음
  • cpu_meltdown: CPU는 붕괴 공격의 영향을받으며 커널 페이지 테이블 격리가 필요합니다.
  • spectre_v1: CPU는 조건부 분기를 사용한 Spectre variant 1 공격의 영향을받습니다.
  • spectre_v2: CPU는 간접 분기를 사용한 스펙터 변형 2 공격의 영향을받습니다.
  • spec_store_bypass: CPU는 Speculative Store Bypass 취약점 (Spectre variant 4)의 영향을받습니다 .

PS이 목록은 arch/x86/include/asm/cpufeatures.h커널 소스에서 파생되었습니다 . 플래그는 소스 코드와 동일한 순서로 나열됩니다. 누락 된 기능에 대한 설명에 대한 링크를 추가하고 표현이없는 기능에 대한 간단한 설명을 작성하고 새 커널 버전의 목록을 업데이트하여 도움을주십시오. 현재 목록은 Linux 4.15 와 이후의 추가 사항입니다.


1
유익한 질문과 요약 및 자세한 답변을 제공하는 @Gilles 및 편집자에게 감사드립니다. 이제 CPU 기능을 확인하기 위해 Intel CPU와 같은 NixCraft에서 가져온 다음을 사용합니다 $ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u. CLI / GUI의 우수한 i-nex도 있습니다.
tuk0z

뛰어난 설명 및 링크 모음; 기여한 모든 사람에게 감사합니다.
Paul Gear

버그 데이터는 어디에서 왔습니까? cpufeatures.h 파일에 나타나지 않는 것 같습니다.
Drazisil

@Drazisil 내가 기억하는 한 모든 항목은 표시된 버전에서 온 것입니다 cpufeatures.h. 설명은 누군가가 노력을 기울인 곳을 더 이해하기 쉽고 더 유익하게 만들기 위해 편집되었습니다.
Gilles

@Gilles 그것은 버그를 제외한 모든 경우에 해당되는 것 같습니다. 그것들이 보이지 않도록 따로 설정하면 features해당 파일에서 볼 수 없습니다.
Drazisil 2016 년

71

ARM 프로세서에서는 몇 가지 기능이 언급되어 features:있습니다. 여기에는 ARM 제조업체와 직접 관련된 기능 만 언급되며 실리콘 제조업체 또는 시스템 온 칩과 관련된 기능은 없습니다.

기능은 CPU ID를 read_cpuid()찾아서 컴파일 시간에 알려진 프로세서 유형 정의 에서 찾아서 가져옵니다 .이 기능은 기능이 HWCAP_xxx플래그 마스크로 표시됩니다. 해당 문자열은 hwcap_strsetup.c 있습니다.

아래 목록에서 ARMv6에는 SIMD 명령어 및 데이터 유형이 도입되었습니다. ARMv7은 고급 SIMD 명령어 및 데이터 유형을 제공했습니다. 32 비트 ARM 시스템에서 neonAdvanced SIMD를 신호합니다. asimd64 비트 암 머신에서 고급 SIMD 신호 를 보냅니다.

그 외에도 Hardware:선은 프로세서 모델을 나타냅니다. 모델에 따라 /proc또는 아래의 다른 파일 /sys또는 부팅시 커널 로그 메시지에 다른 정보가있을 수 있습니다 . 불행히도 각 ARM CPU 제조업체는 프로세서 기능을보고하는 고유 한 방법이 있습니다 (있는 경우).



11

x86

4.1.3 x86 및 Intel 설명서에서 직접 찾으십시오.

arch/x86/include/asm/cpufeature.h 전체 목록을 포함합니다.

정의 값은 다음과 같은 유형입니다.

X*32 + Y

예 :

#define X86_FEATURE_FPU     ( 0*32+ 0) /* Onboard FPU */

CPUID에서 추출 된 기능 플래그는 다음에 저장됩니다.

  • __u32 x86_capability[NCAPINTS + NBUGINTS];
  • struct cpuinfo_x86 boot_cpu_data
  • 에 정의 x86/kernel/setup.c

__init함수를 통해 초기화됩니다 .

x86_capability배열 요소의 출처는 다음과 같습니다.

| index | eax      | ecx | output | file        |
|-------|----------|-----|--------|-------------|
|     0 |        1 |   0 | edx    | common.c    |
|     1 | 80000001 |     | edx    | common.c    |
|     2 | 80860001 |     | edx    | transmeta.c |
|     3 |          |     |        |             |
|     4 |        1 |   0 | ecx    | common.c    |
|     5 | C0000001 |     | edx    | centaur.c   |
|     6 | 80000001 |     | ecx    | common.c    |
|     7 |          |     |        | scattered.c |
|     8 |          |     |        |             |
|     9 |        7 |   0 | ebx    | common.c    |
|    10 |        D |   1 | eax    | common.c    |
|    11 |        F |   0 | edx    | common.c    |
|    12 |        F |   1 | edx    | common.c    |

노트:

결론 :

  • 대부분의 항목은 CPUID 출력 레지스터에서 직접 가져오고 common.c다음과 같이 설정됩니다 .

    c->x86_capability[0] = edx;
    

    CPUID에 대한 인텔 매뉴얼에서 일괄 적으로 쉽게 찾을 수 있습니다.

  • 다른 소스는 소스 전체에 흩어져 있으며로 비트 단위로 설정됩니다 set_cpu_cap.

    그들을 찾으려면 git grep X86_FEATURE_XXXinside를 사용하십시오 arch/x86.

    일반적으로 주변 코드에서 해당 CPUID 비트를 추론 할 수 있습니다.

다른 재미있는 사실

  • 플래그는 실제로 arch/x86/kernel/cpu/proc.c코드와 함께 인쇄됩니다 .

    seq_puts(m, "flags\t\t:");
    for (i = 0; i < 32*NCAPINTS; i++)
        if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
            seq_printf(m, " %s", x86_cap_flags[i]);
    

    어디:

    • cpu_has 기능에 대한 기본 점검을 수행합니다.
    • x86_cap_flags[i] 각 플래그에 해당하는 문자열을 포함합니다.

    이것은 proc시스템 설정에 대한 콜백으로 전달됩니다 . 진입 점은 fs/proc/cpuinfo.c입니다.

  • x86_cap_flags문자열은 다음과 같이 "파싱" 하여 arch/x86/kernel/cpu/mkcapflags.h직접 생성합니다 .arch/x86/include/asm/cpufeature.hsed

    출력은 arch/x86/kernel/cpu/capflags.c빌드 디렉토리로 이동하고 결과 배열은 다음과 같습니다.

    const char * const x86_cap_flags[NCAPINTS*32] = {
        [X86_FEATURE_FPU]        = "fpu",
        [X86_FEATURE_VME]        = "vme",
    

    예를 들어 X86_FEATURE_FPU문자열 등에 해당합니다 "fpu".

  • cpu_has 코드와 함께 두 가지 경우로 분류됩니다.

    #define cpu_has(c, bit)                         \
        (__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 :  \
        test_cpu_cap(c, bit))
    

    그들은:

    • __builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit): 커널을 실행하려면 플래그가 필요합니다.

      이것은 내부 데이터에 의해 결정되며 required-features.h, 다음과 같은 의견이 있습니다.

      Define minimum CPUID feature set for kernel These bits are checked
      really early to actually display a visible error message before the
      kernel dies.  Make sure to assign features to the proper mask!
      

      컴파일 시간 (커널 요구 사항)에서 알려진 것으로 시작시 이미 확인되었으므로 컴파일 시간 bit에 알려진 경우 컴파일 시간에 확인할 수 있습니다 .

      따라서 __builtin_constant_p(bit)어느 bit것이 컴파일 타임 상수 인지 검사합니다 .

    • test_cpu_cap: 이것은 전 세계의 CPUID데이터를 사용합니다struct cpuinfo_x86 boot_cpu_data


3
약어에서 더 긴 이름으로 이동하는 방법에 대해 설명했지만 더 긴 이름은 더 이해하기 쉽지 않으며 cpuid더 편리한 방식으로 수행됩니다. 나는 그 질문에 이름이 기록 된 장소를 갖도록 요청했다.
Gilles

@Gilles 이것은 주로 테이블을 만들고 싶은 사람들을 위해 / 나와 같은 테이블에서 기능을 찾을 수없는 사람들을위한 것입니다. 그러나 여전히 대부분의 경우 소스의 올바른 지점을 보면 CPUID에 대한 맵은 다음과 같습니다. 즉시.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

10

또는 cpuid프로그램 을 사용할 수 있습니다 . 데비안 저장소에 있어야합니다. CPU에 대한 가능한 모든 정보를 약간의 설명으로 덤프하므로 모호한 플래그를 얻지 못합니다.


cpuid약어를 확장합니다. 나는 실제로 출력 설명을 부르지 않을 것이다 . 그것이 알고 ht"하이퍼 스레딩은"어느 정도를 설명하고 의미하지만, 그것을 아는 것은 mmx순전히 "MMX 명령어 세트"를 의미하고, 그것은 mca거의 "기계 검사 아키텍처"를 의미합니다.
Gilles

6
@Gilles ...하지만 "Machine Check Architecture"는 "mca"보다 확실히 Google 쿼리입니다.)
Alois Mahdal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.