x86

x86

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

예를 들어, 다음 발췌 내용에 따르면 /proc/cpuinfo64비트 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

답변1

x86

(32비트, 즉 i386–i686, 64비트, 즉 amd64. 즉, 워크스테이션, 노트북 또는 서버입니다.)

자주하는 질문:나한테는…

  • 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.

Intel에서 정의한 CPU 기능, CPUID 레벨 0x00000001(edx)

당신은 또한 볼 수 있습니다위키피디아표 2-27인텔 고급 벡터 확장 프로그래밍 참조

AMD에서 정의한 CPU 특성, CPUID 레벨 0x80000001

당신은 또한 볼 수 있습니다위키피디아표 2-23인텔 고급 벡터 확장 프로그래밍 참조

Transmeta에서 정의한 CPU 특성, CPUID 레벨 0x80860001

  • recovery:CPU가 복구 모드에 있습니다.
  • longrun:장기 전력 제어
  • lrti:LongRun 테이블 인터페이스

기타 기능, Linux 정의 매핑

  • cxmmx: Cyrix MMX 확장
  • k6_mtrr: AMD K6 비표준 MTRR
  • cyrix_arr: 사이릭스 ARR(=MTRR)
  • centaur_mcr: 센타우리 MCR (= MTRR)
  • constant_tsc: TSC가 일정한 속도로 틱합니다.
  • up:SMP 커널은 UP에서 실행됩니다.
  • art: 항상 실행되는 타이머
  • arch_perfmon: 인텔 아키텍처 PerfMon
  • pebs: 정확한 이벤트 기반 샘플링
  • bts: 지점 추적 매장
  • rep_good: 마이크로코드가 매우 잘 작동함을 나타냅니다.
  • acc_power:AMD 전력 축적 메커니즘
  • nopl:NOPL(0F 1F) 명령
  • xtopology: CPU 토폴로지 열거 확장
  • tsc_reliable:TSC믿을만하다고 알려진
  • nonstop_tsc:TSCC 상태에서 멈추지 마세요
  • cpuid: CPU 자체에는 CPUID 명령이 있습니다.
  • extd_apicid: 확장 APICID 포함(8비트)
  • amd_dcm:다중 노드 프로세서
  • aperfmperf:APERFMPERF
  • eagerfpu: 지연되지 않은 FPU 복구
  • nonstop_tsc_s3:TSCS3 상태에서 멈추지 않음
  • tsc_known_freq:TSC알려진 주파수
  • mce_recovery:CPU에는 복구 가능한 머신 검사 기능이 있습니다.

Intel 정의 CPU 특성, CPUID 레벨 0x00000001(ecx)

당신은 또한 볼 수 있습니다위키피디아표 2-26인텔 고급 벡터 확장 프로그래밍 참조

VIA/Cyrix/Centaur, CPUID 레벨 0xC0000001에 의해 정의된 CPU 특성

  • rng:난수 생성기지금(xstore)
  • rng_en:난수 생성기활성화됨
  • ace: CPU 암호화(xcrypt)
  • ace_en: CPU 내 암호화 활성화
  • ace2: 고급 암호화 엔진 v2
  • ace2_en: ACE v2 활성화
  • phe: PadLock 해시 엔진
  • phe_en: 판형 열교환기 활성화
  • pmm:자물쇠 몽고메리 승수
  • pmm_en:PMM 활성화됨

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

  • lahf_lm: 롱 모드에서는 플래그(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: 표현하다운영 체제에 표시되는 해결 방법이를 통해 운영 체제는 프로세서 오류를 해결할 수 있습니다.
  • ibs:명령어 기반 샘플링
  • xop:확장된 AVX 지침
  • skinit:SKINIT/STGI 설명
  • wdt:감시 타이머
  • lwp:경량 분석
  • fma4:4-피연산자 MAC 명령어
  • tce: 번역 캐시 확장
  • nodeid_msr:노드 ID MSR
  • tbm:후행 비트 연산
  • topoext:토폴로지 확장 CPUID 리프
  • perfctr_core:핵심 성능 카운터 확장
  • perfctr_nb: NB 성능 카운터 확장
  • bpext:데이터 중단점 확장
  • ptsc:성능 타임스탬프 카운터
  • perfctr_l2:L2 성능 카운터 확장
  • mwaitx: MWAIT확장하다( MONITORX/ MWAITX)

보조 플래그: Linux 정의 - 다양한 CPUID 수준에 분산된 기능용

  • ring3mwait: 링 3 모니터/대기
  • 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-P 상태
  • proc_feedback:AMD ProcFeedback 인터페이스
  • sme:AMD 보안 메모리 암호화
  • pti:커널 페이지 테이블 격리(시저)
  • retpoline:라이트볼린쉬움귀신변형 2(간접 분기)
  • 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: VMMCALL선호하다VMCALL

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

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

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

Intel 정의 CPU QoS 하위 리프, CPUID 수준 0x0000000F:0(edx)

  • cqm_llc: 유한책임회사 서비스 품질

Intel 정의 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: ASID를 통한 AMD 새로 고침 지원
  • decodeassists: AMD 디코딩 지원 지원
  • pausefilter:AMD 필터링 일시 중지 차단
  • pfthreshold:AMD 일시 정지 필터 임계값
  • avic:가상 인터럽트 컨트롤러
  • vmsave_vmload:가상 VMSAVE VMLOAD
  • vgif: 가상 GIF

Intel에서 정의한 CPU 기능, CPUID 수준 0x00000007:0(ecx)

  • avx512vbmi: AVX512 벡터 비트 연산 명령어
  • umip:사용자 모드 명령 보호
  • pku: 사용자 공간 보호 키
  • ospke: 운영 체제 보호 키가 활성화되었습니다.
  • avx512_vbmi2: 추가 AVX512 벡터 비트 연산 명령어
  • gfni: 갈루아 필드의 새로운 명령
  • 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:CPUFDIV
  • coma:사이릭스 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: "" IRET에서 16비트 SS로 ESP/RSP 상위 비트 손상
  • null_seg: 선택기를 지우면 베이스가 보존됩니다.
  • swapgs_fence:SWAPGS는 GS 입력에 의존하지 않습니다.
  • monitor: 원격 CPU를 깨우려면 IPI가 필요합니다.
  • amd_e400:Eratum 400의 영향을 받는 CPU
  • cpu_meltdown:CPU가 영향을 받음충돌 공격커널 페이지 테이블 격리가 필요합니다.
  • spectre_v1:CPU가 영향을 받음귀신조건부 분기를 사용한 변종 1 공격
  • spectre_v2:CPU가 영향을 받음귀신간접 분기를 이용한 변종 2 공격
  • spec_store_bypass: 영향을 받는 CPU투기상점 우회취약점(스펙터 변종 4).

arch/x86/include/asm/cpufeatures.hPS 이 목록은 커널 소스 코드 에서 파생되었습니다 . 플래그는 소스 코드와 동일한 순서로 나열됩니다. 기능이 누락된 경우 기능 설명에 대한 링크를 추가하고, 이름이 모호한 기능에 대한 간단한 설명을 작성하고, 새 커널 버전 목록을 업데이트하여 도움을 주세요. 현재 목록의 출처는 다음과 같습니다.리눅스 4.15게다가 나중에 추가된 내용도 있습니다.

답변2

ARM 프로세서의 경우 이 줄에서는 몇 가지 기능을 언급합니다 features:. 칩 제조업체나 시스템 온 칩에 특정한 기능보다는 ARM 아키텍처와 직접적으로 관련된 기능만 언급됩니다.

이러한 특성은 CPU ID를 조회하여 얻을 수 있습니다.read_cpuid()그리고 검색해 보세요프로세서 유형 정의기능이 마스크로 표시되는 컴파일 타임에 알려짐HWCAP_xxx배너. 해당 문자열은hwcap_str대기 중setup.c.

아래 목록에서 ARMv6에는 SIMD 명령어와 데이터 유형이 도입되었습니다. ARMv7은 고급 SIMD 명령어와 데이터 유형을 제공합니다. 32비트 ARM 시스템에서는 neon고급 SIMD를 나타내고 asimd64비트 ARM 시스템에서는 고급 SIMD를 나타냅니다.

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

답변3

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    |

노트:

결론적으로:

  • common.c대부분의 항목은 CPUID 출력 레지스터에서 직접 나오며 다음을 통해 설정됩니다.

    c->x86_capability[0] = edx;
    

    이는 Intel의 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_capCPUID: 전 세계의 데이터를 소비합니다.struct cpuinfo_x86 boot_cpu_data

답변4

@Gilles의 최고의 답변에서 영감을 받아 현재 CPU 플래그에 주석을 추가하는 bash 스크립트(bash v4 이상, 네트워크 연결 및 최근 wget 필요)는 다음과 같습니다.

#! /bin/bash

CPUFEATURES="$(wget -qO- "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/plain/arch/x86/include/asm/cpufeatures.h")" 
grep "^flags" /proc/cpuinfo |
        uniq |
        sed 's/^.*: //' |
        tr ' ' '\n' |
        while read line; do
                echo -n "${line}: "
                echo "$CPUFEATURES" |
                grep "FEATURE_${line^^}" |
                        sed 's|.*) /\* ||' |
                        sed 's| \*/$||'
        done

관련 정보