Bagaimana saya bisa tahu apakah prosesor saya memiliki fitur tertentu? (Set instruksi 64-bit, virtualisasi berbantuan perangkat keras, akselerator kriptografi, dll.) Saya tahu bahwa file tersebut /proc/cpuinfo
berisi informasi ini, di flags
baris tersebut, tetapi apa arti semua singkatan samar ini?
Misalnya, dengan diberikan ekstrak berikut /proc/cpuinfo
, apakah saya memiliki CPU 64-bit? Apakah saya memiliki virtualisasi perangkat keras?
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
$ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u
. Dan ada juga CLI / GUI yang sangat baik i-nex .cpufeatures.h
. Deskripsi diedit untuk membuatnya lebih komprehensif dan lebih informatif di mana seseorang mengambil upaya untuk melakukan itu.features
saya tidak melihatnya di file itu.LENGAN
Pada prosesor ARM, beberapa fitur disebutkan di dalam
features:
baris. Hanya fitur yang terkait langsung dengan arsitektur ARM yang disebutkan di sana, bukan fitur khusus untuk pabrikan silikon atau sistem pada chip.Fitur-fitur diperoleh dari mencari id CPU dengan
read_cpuid()
dan mencarinya dalam definisi tipe prosesor yang dikenal pada waktu kompilasi di mana fitur tersebut dinyatakan sebagai topengHWCAP_xxx
bendera. String yang sesuai ada dihwcap_str
dllsetup.c
.Dalam daftar di bawah ini, ARMv6 memperkenalkan instruksi dan tipe data SIMD. ARMv7 menyediakan instruksi dan tipe data SIMD Lanjutan. Pada mesin ARM 32-bit,
neon
memberi sinyal Advanced SIMD; sementaraasimd
memberi sinyal Advanced SIMD pada mesin lengan 64-bit.swp
:SWP
instruksi ( atom baca-modifikasi-tulis )half
: Pengisian dan penyimpanan setengah katathumb
: Thumb (set instruksi 16-bit)26bit
: Model "26 Bit" (Register status prosesor dilipat ke dalam penghitung program)fastmult
: 32 × 32 → Perkalian 64-bitfpa
: Akselerator titik mengambangvfp
: VFP ( petunjuk floating point vektor SIMD awal )edsp
: Ekstensi DSP (varian 'e' dari CPU ARM9, dan yang lainnya di atas)java
: Jazelle (akselerator bytecode Java)iwmmxt
: Instruksi SIMD mirip dengan Intel MMXcrunch
: Coprocessor MaverickCrunch (jika dukungan kernel diaktifkan)thumbee
: ThumbEEneon
: Advanced SIMD / NEON (asimd
pada kernel yang lebih tua AArch64)vfpv3
: VFP versi 3vfpv3d16
: VFP versi 3 dengan 16 D-registertls
: Register TLSvfpv4
: VFP versi 4 dengan pengalihan konteks cepatidiva
:SDIV
danUDIV
divisi perangkat keras dalam mode ARMidivt
:SDIV
danUDIV
divisi perangkat keras dalam mode Jempolvfpd32
: VFP dengan 32 D-registerlpae
: Ekstensi Alamat Fisik Besar (> 4GB memori fisik pada arsitektur 32-bit)evtstrm
: aliran peristiwa kernel menggunakan penghitung waktu architected generikaes
: AES yang dipercepat perangkat keras (kriptografi kunci-rahasia)pmull{2}
: 64 × 64 → 128-bit F 2 m perkalian - akselerasi untuk mode GCM enkripsi terotentikasisha1
: hardware-accelerated SHA-1sha2
: hardware-accelerated SHA-256crc32
: hardware-accelerated CRC-32Di luar itu,
Hardware:
garis menunjukkan model prosesor. Bergantung pada modelnya, mungkin ada informasi lain di file lain di bawah/proc
atau/sys
, atau dalam pesan log kernel saat boot. Sayangnya setiap produsen CPU ARM memiliki metode sendiri untuk melaporkan fitur prosesor, jika ada.sumber
x86
Temukan sendiri di 4.1.3 x86 dan manual Intel
arch/x86/include/asm/cpufeature.h
berisi daftar lengkap.Nilai yang ditentukan adalah tipe:
Misalnya:
Bendera fitur, yang diekstrak dari CPUID, disimpan di dalam:
__u32 x86_capability[NCAPINTS + NBUGINTS];
bidangstruct cpuinfo_x86 boot_cpu_data
x86/kernel/setup.c
yang diinisialisasi melalui
__init
fungsi.Dari mana setiap
x86_capability
elemen array berasal:Catatan:
index
: adalah indeksx86_capability
, misalnyax86_capability[0]
eax
danexc
: adalah nilai input untuk CPUID dalam hex. Input yang menggunakanexc
, yang lebih sedikit, menyebutnya subleaf (dari pohon 2 level denganeax
di root).output
: adalah register dari mana output CPUID diambilfile
: adalah file tempat bidang-bidang tersebut didefinisikan. Path relatif terhadaparch/x86/kernel/cpu/
.transmeta
: adalah nama vendor CPU https://en.wikipedia.org/wiki/Transmeta yang diakuisisi oleh Novafora https://www.crunchbase.com/organization/novaforacentaur
: adalah nama vendor CPU https://en.wikipedia.org/wiki/Centaur_Technology yang diperoleh oleh VIA https://en.wikipedia.org/wiki/VIA_Technologies . Cyrix adalah satu lagi.Kesimpulan:
sebagian besar entri datang langsung dari register keluaran CPUID dan diatur
common.c
oleh sesuatu seperti:Itu mudah ditemukan dalam batch pada manual Intel untuk CPUID.
yang lain tersebar di seluruh sumber, dan diatur sedikit demi sedikit dengan
set_cpu_cap
.Untuk menemukannya, gunakan
git grep X86_FEATURE_XXX
di dalamarch/x86
.Anda biasanya dapat menyimpulkan bit CPUID mana yang sesuai dengan kode di sekitarnya.
Fakta menyenangkan lainnya
Bendera sebenarnya dicetak
arch/x86/kernel/cpu/proc.c
dengan kode:Dimana:
cpu_has
apakah pemeriksaan utama untuk fitur.x86_cap_flags[i]
berisi string yang sesuai dengan setiap bendera.Ini dilewatkan sebagai panggilan balik ke
proc
pengaturan sistem. Titik masuknya difs/proc/cpuinfo.c
.x86_cap_flags
string dihasilkan oleharch/x86/kernel/cpu/mkcapflags.h
langsung dariarch/x86/include/asm/cpufeature.h
dengan "parsing" dengansed
...Output menuju ke
arch/x86/kernel/cpu/capflags.c
direktori build, dan array yang dihasilkan terlihat seperti:jadi misalnya
X86_FEATURE_FPU
sesuai dengan string"fpu"
dan sebagainya.cpu_has
dipecah menjadi dua kasus dengan kode:Mereka:
__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit)
: bendera diperlukan untuk menjalankan kernel.Ini ditentukan oleh data di dalam
required-features.h
, yang berkomentar:Karena itu diketahui pada waktu kompilasi (persyaratan kernel), telah diperiksa pada saat startup, pemeriksaan dapat diselesaikan pada waktu kompilasi jika
bit
diketahui pada waktu kompilasi.Jadi
__builtin_constant_p(bit)
yang memeriksa apakahbit
adalah waktu kompilasi konstan.test_cpu_cap
: ini menggunakanCPUID
data daristruct cpuinfo_x86 boot_cpu_data
globalsumber
cpuid
melakukannya dengan cara yang lebih nyaman. Saya mengajukan pertanyaan itu untuk memiliki tempat di mana nama-nama itu didokumentasikan.Atau sebagai alternatif, Anda dapat menggunakan
cpuid
program, harus dalam repositori debian. Itu dump setiap info yang mungkin tentang CPU Anda dengan beberapa penjelasan, sehingga Anda tidak mendapatkan bendera yang tidak jelas.sumber
cpuid
memperluas singkatan. Saya tidak akan menyebut penjelasan outputnya . Mengetahui ituht
berarti "Hyper Threading" menjelaskannya sampai batas tertentu, tetapi mengetahui itummx
berarti "set instruksi MMX", tidak begitu banyak, dan itumca
berarti "Arsitektur Pemeriksaan Mesin", hampir tidak.