내 프로세서에 특정 기능이 있는지 어떻게 알 수 있나요? (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
답변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인텔 고급 벡터 확장 프로그래밍 참조
fpu
: 탑승 중부동 소수점 단위(부동 소수점 지원)vme
:가상 8086 모드 향상de
:디버그 확장(CR4.DE)pse
:페이지 크기 확장(4MB메모리 페이지)tsc
:타임스탬프 카운터(RDTSC)msr
:모델별 레지스터(RDMSR, WRMSR)pae
:물리적 주소 확장(4GB 이상의 메모리 지원)mce
:기계 점검 예외cx8
:CMPXCHG8 명령(64비트비교하고 교환하다)apic
: 탑승 중APICsep
:시스템 센터/시스템 종료mtrr
:메모리 유형 범위 레지스터pge
:페이지 전역 활성화(PDE 및 PTE의 전역 비트)mca
:머신 체크 아키텍처cmov
:CMOV 명령(조건부 이동) (또한FCMOV)pat
:페이지 속성 테이블pse36
:36비트 PSE(큰 페이지)pn
:프로세서 일련 번호clflush
:캐시 라인 플러시지침dts
: 디버그 저장소(디버깅 및 프로파일링 지침을 위한 버퍼)acpi
:ACPIMSR(온도 모니터링 및 클럭 속도 변조)을 통해mmx
:멀티미디어 확장fxsr
:FXSAVE/FXRSTOR,CR4.OSFXSRsse
:인텔SSE벡터 지침sse2
:상하이 증권거래소 2ss
:CPU 자체탐정ht
:하이퍼스레딩및/또는 멀티코어tm
: 자동 시계 제어(열 모니터)ia64
:인텔 아이테니엄 아키텍처x86-64
64비트(플래그가 있는 Intel 64비트 x86 아키텍처 또는 flag로 표시된 "AMD64" 비트와 혼동하지 마십시오lm
)pbe
:보류 중인 인터럽트 활성화됨(PBE# 핀) 웨이크업 지원
AMD에서 정의한 CPU 특성, CPUID 레벨 0x80000001
당신은 또한 볼 수 있습니다위키피디아표 2-23인텔 고급 벡터 확장 프로그래밍 참조
syscall
:시스템 호출(빠른 시스템 호출) 및자매(빠른 시스템 호출에서 복귀)mp
:다중 처리유능한.nx
:실행 비활성화mmxext
:AMD MMX 확장fxsr_opt
: FXSAVE/FXRSTOR 최적화pdpe1gb
:1GB페이지(허용하다hugepagesz=1G
)rdtscp
:타임스탬프 카운터 및 프로세서 ID 읽기lm
:장거리 모드(x86-64:amd64(64비트를 지원하는 Intel 64라고도 함)3dnowext
: 이제 AMD 3D를 만나보세요! 확장하다3dnow
:이제 3D로!(인텔의 SSE1과 경쟁하는 AMD 벡터 명령어)
Transmeta에서 정의한 CPU 특성, CPUID 레벨 0x80860001
recovery
:CPU가 복구 모드에 있습니다.longrun
:장기 전력 제어lrti
:LongRun 테이블 인터페이스
기타 기능, Linux 정의 매핑
cxmmx
: Cyrix MMX 확장k6_mtrr
: AMD K6 비표준 MTRRcyrix_arr
: 사이릭스 ARR(=MTRR)centaur_mcr
: 센타우리 MCR (= MTRR)constant_tsc
: TSC가 일정한 속도로 틱합니다.up
:SMP 커널은 UP에서 실행됩니다.art
: 항상 실행되는 타이머arch_perfmon
: 인텔 아키텍처 PerfMonpebs
: 정확한 이벤트 기반 샘플링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
:APERFMPERFeagerfpu
: 지연되지 않은 FPU 복구nonstop_tsc_s3
:TSCS3 상태에서 멈추지 않음tsc_known_freq
:TSC알려진 주파수mce_recovery
:CPU에는 복구 가능한 머신 검사 기능이 있습니다.
Intel 정의 CPU 특성, CPUID 레벨 0x00000001(ecx)
당신은 또한 볼 수 있습니다위키피디아표 2-26인텔 고급 벡터 확장 프로그래밍 참조
pni
:SSE-3("프레스콧새로운 지시문")pclmulqdq
:4단어 캐리리스 곱셈을 수행합니다. 지침- 액셀러레이터가스 크로마토그래피)dtes64
: 64비트 디버그 저장monitor
:모니터/Mwait 지원(인텔 SSE3 보충)ds_cpl
:CPL 자격. 디버그 저장vmx
:하드웨어 가상화: 인텔가상 MXsmx
: 더 안전한 모드:txt(완전한 생산 관리지원하다)est
: 강화됨속도 단계tm2
:열 모니터 2ssse3
:보충 SSE-3cid
:컨텍스트 IDsdbg
: 실리콘 디버깅fma
:곱하기 및 융합 추가하기cx16
:CMPXCHG16Bxtpr
:작업 우선순위 메시지 보내기pdcm
:성능 역량pcid
: 프로세스 컨텍스트 식별자dca
:직접 캐시 액세스sse4_1
:SSE-4.1sse4_2
:SSE-4.2x2apic
:x2APICmovbe
:바이트 교환 후 데이터 이동지침popcnt
:1로 설정된 자릿수를 반환합니다. 지침(해밍 웨이트, 즉 자릿수)tsc_deadline_timer
: Tsc 만료 타이머aes
/aes-ni
:고급 암호화 표준(새 지침)xsave
:프로세서 확장 상태 저장: 도 가능XGETBY,XRSTOR,XSETBYavx
:고급 벡터 확장f16c
: 16비트 fp 변환(연속 가변 속도 16)rdrand
:난수 읽기하드웨어 난수 생성기에서지침hypervisor
: 작동 중관리 프로그램
VIA/Cyrix/Centaur, CPUID 레벨 0xC0000001에 의해 정의된 CPU 특성
rng
:난수 생성기지금(xstore)rng_en
:난수 생성기활성화됨ace
: CPU 암호화(xcrypt)ace_en
: CPU 내 암호화 활성화ace2
: 고급 암호화 엔진 v2ace2_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-Vextapic
: APIC 공간 확장cr8_legacy
: 32비트 모드의 CR8abm
:고급 비트 조작sse4a
:SSE-4Amisalignsse
: 잘못 정렬된 데이터에 대해 작동할 때 특정 레거시 SSE 명령어가 일반 보호 예외(#GP)를 생성하는지 여부를 나타냅니다. 또한 CR0 및 정렬 검사 비트에 따라 달라집니다.3dnowprefetch
: 3DNow 프리페치 지침osvw
: 표현하다운영 체제에 표시되는 해결 방법이를 통해 운영 체제는 프로세서 오류를 해결할 수 있습니다.ibs
:명령어 기반 샘플링xop
:확장된 AVX 지침skinit
:SKINIT/STGI 설명wdt
:감시 타이머lwp
:경량 분석fma4
:4-피연산자 MAC 명령어tce
: 번역 캐시 확장nodeid_msr
:노드 ID MSRtbm
:후행 비트 연산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
: 코드 및 데이터 우선순위 L3invpcid_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
: 인텔 가상 NMIflexpriority
: 인텔 FlexPriorityept
:인텔 확장 페이지 테이블vpid
: 인텔 가상 프로세서 IDvmmcall
:VMMCALL
선호하다VMCALL
Intel 정의 CPU 기능, CPUID 레벨 0x00000007:0(ebx)
fsgsbase
:{RD/WR}{FS/GS}BASE 명령tsc_adjust
: TSC가 MSR을 조정합니다.bmi1
: 첫 번째 비트 연산 확장 세트hle
:하드웨어 잠금 제거avx2
:AVX2 지침smep
: 감독자 모드 실행 보호bmi2
: 비트 연산 확장의 두 번째 그룹erms
: 향상된 REP MOVSB/STOSBinvpcid
: 프로세서 컨텍스트 ID를 무효화합니다.rtm
: 제한된 트랜잭션 메모리cqm
: 캐시 QoS 모니터링mpx
: 메모리 보호 확장rdt_a
: 리소스 디렉터 기술 구성avx512f
:AVX-512 기본avx512dq
:AVX-512 듀얼/쿼드 명령어rdseed
:RDSEED 명령adx
:ADCX 및 ADOX 명령어smap
: 관리자 모드 접근 방지avx512ifma
:AVX-512 정수 융합 곱셈 및 덧셈 명령어clflushopt
:CLFLUSHOPT
지침clwb
:CLWB
지침intel_pt
:인텔 프로세서 추적avx512pf
:AVX-512 프리페칭avx512er
:AVX-512 지수 및 역수avx512cd
:AVX-512 충돌 감지sha_ni
:SHA1/SHA256 명령 확장avx512bw
:AVX-512 바이트/워드 명령어avx512vl
: AVX-512 128/256 벡터 길이 확장
확장 상태 기능, CPUID 레벨 0x0000000d:1(eax)
xsaveopt
: 최적화XSAVE
xsavec
:XSAVEC
xgetbv1
:XGETBV
ECX=1xsaves
: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 잠긴 MSRnrip_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 VMLOADvgif
: 가상 GIF
Intel에서 정의한 CPU 기능, CPUID 수준 0x00000007:0(ecx)
avx512vbmi
: AVX512 벡터 비트 연산 명령어umip
:사용자 모드 명령 보호pku
: 사용자 공간 보호 키ospke
: 운영 체제 보호 키가 활성화되었습니다.avx512_vbmi2
: 추가 AVX512 벡터 비트 연산 명령어gfni
: 갈루아 필드의 새로운 명령vaes
: 벡터 AESvpclmulqdq
: 캐리프리 곱셈 더블 쿼드워드avx512_vnni
: 벡터 신경망 지침avx512_bitalg
:VPOPCNT[B,W] 및 VPSHUF-BITQMB 명령어avx512_vpopcntdq
: DW/QW 벡터의 POPCNTla57
: 레벨 5 페이지 테이블rdpid
:RDPID 명령
AMD 정의 CPU 기능, CPUID 레벨 0x80000007(ebx)
overflow_recov
:MCA 오버플로 복구 지원succor
: 수정 불가능한 오류 억제 및 복구smca
: 확장 가능한 MCA
CPU 오류 감지(Linux 정의)
f00f
:인텔 F00Ffdiv
:CPUFDIVcoma
:사이릭스 6x86 코마amd_tlb_mmatch
:tlb_mmatch
AMD 정오표 383amd_apic_c1e
:apic_c1e
AMD 정오표 40011ap
: 잘못된 로컬 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의 영향을 받는 CPUcpu_meltdown
:CPU가 영향을 받음충돌 공격커널 페이지 테이블 격리가 필요합니다.spectre_v1
:CPU가 영향을 받음귀신조건부 분기를 사용한 변종 1 공격spectre_v2
:CPU가 영향을 받음귀신간접 분기를 이용한 변종 2 공격spec_store_bypass
: 영향을 받는 CPU투기상점 우회취약점(스펙터 변종 4).
arch/x86/include/asm/cpufeatures.h
PS 이 목록은 커널 소스 코드 에서 파생되었습니다 . 플래그는 소스 코드와 동일한 순서로 나열됩니다. 기능이 누락된 경우 기능 설명에 대한 링크를 추가하고, 이름이 모호한 기능에 대한 간단한 설명을 작성하고, 새 커널 버전 목록을 업데이트하여 도움을 주세요. 현재 목록의 출처는 다음과 같습니다.리눅스 4.15게다가 나중에 추가된 내용도 있습니다.
답변2
팔
ARM 프로세서의 경우 이 줄에서는 몇 가지 기능을 언급합니다 features:
. 칩 제조업체나 시스템 온 칩에 특정한 기능보다는 ARM 아키텍처와 직접적으로 관련된 기능만 언급됩니다.
이러한 특성은 CPU ID를 조회하여 얻을 수 있습니다.read_cpuid()
그리고 검색해 보세요프로세서 유형 정의기능이 마스크로 표시되는 컴파일 타임에 알려짐HWCAP_xxx
배너. 해당 문자열은hwcap_str
대기 중setup.c
.
아래 목록에서 ARMv6에는 SIMD 명령어와 데이터 유형이 도입되었습니다. ARMv7은 고급 SIMD 명령어와 데이터 유형을 제공합니다. 32비트 ARM 시스템에서는 neon
고급 SIMD를 나타내고 asimd
64비트 ARM 시스템에서는 고급 SIMD를 나타냅니다.
swp
:SWP
지침(원자적 읽기-수정-쓰기)half
:하프워드 로드 및 저장thumb
:무지(16비트 명령어 세트)26bit
:"26비트" 모델(프로세서 상태 레지스터가 프로그램 카운터에 병합됨)fastmult
:32×32→64비트 곱셈fpa
:부동 소수점 가속기vfp
:VFP(일찍단일 명령 다중 데이터 스트림벡터 부동 소수점 명령어)edsp
:DSP 확장(ARM9 CPU의 "e" 변형 및 위에 언급된 다른 모든 CPU)java
:자젤(Java 바이트코드 가속기)iwmmxt
:단일 명령 다중 데이터 스트림지시하다인텔 MMX 과 유사함crunch
:독보적인 긴축보조 프로세서(커널 지원이 활성화된 경우)thumbee
:엄지 전자 버전neon
:고급 SIMD/NEON(asimd
이전 AArch64 커널에서)vfpv3
:VFP 버전 3vfpv3d16
:16개의 D 레지스터가 있는 VFP 버전 3tls
:전송 계층 보안 프로토콜등록하다vfpv4
: 빠른 컨텍스트 전환 기능을 갖춘 VFP 버전 4idiva
:SDIV
및UDIV
ARM 모드의 하드웨어 분할idivt
:SDIV
및UDIV
Thumb 모드의 하드웨어 파티셔닝vfpd32
:32개의 D 레지스터가 있는 VFPlpae
:대규모 물리적 주소 확장(32비트 아키텍처에서 >4GB 물리적 메모리)evtstrm
: 공통 아키텍처 타이머를 사용한 커널 이벤트 스트리밍aes
:하드웨어 가속AES(비밀키 암호화)pmull{2}
:64×64 → 128비트 F 2m 곱셈— 인증 및 암호화를 가속화하는 GCM 모드sha1
:하드웨어 가속SHA-1sha2
:하드웨어 가속SHA-256sha512
:하드웨어 가속SHA-512sha3
:하드웨어 가속SHA-3sm3
:하드웨어 가속SM3sm4
:하드웨어 가속SM4crc32
:하드웨어 가속CRC-32
무엇보다도 이 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 |
노트:
- 빈 항목은 "다른 장소에서" 또는 "사용할 수 없음"을 의미합니다.
index
: 는 인덱스입니다x86_capability
. 예:x86_capability[0]
eax
및exc
:는 16진수 CPUID의 입력 값입니다. 입력을 덜 사용exc
하고 호출됩니다.자엽eax
(뿌리에 있는 2층 나무).output
: CPUID 출력을 얻는 레지스터입니다.file
:은 이러한 필드를 정의하는 파일입니다. 경로는 에 상대적입니다arch/x86/kernel/cpu/
.transmeta
: CPU 공급업체의 이름입니다.https://en.wikipedia.org/wiki/Transmeta노바포라(Novafora)에 인수됨https://www.crunchbase.com/organization/novaforacentaur
: CPU 공급업체의 이름입니다.https://en.wikipedia.org/wiki/Centaur_TechnologyVIA에 인수됨https://en.wikipedia.org/wiki/VIA_Technologies. 시릭스는 또 다른 사람이었습니다.
결론적으로:
common.c
대부분의 항목은 CPUID 출력 레지스터에서 직접 나오며 다음을 통해 설정됩니다.c->x86_capability[0] = edx;
이는 Intel의 CPUID 매뉴얼에서 쉽게 찾을 수 있습니다.
다른 것들은 소스 코드 전체에 흩어져 있고 비트 단위로 설정됩니다
set_cpu_cap
.이를 찾으려면
git grep X86_FEATURE_XXX
inside 를 사용하세요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.h
sed
출력은 빌드 디렉터리로 이동
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
답변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