Jak mogę sprawdzić, czy mój procesor ma określoną funkcję? (64-bitowy zestaw instrukcji, wirtualizacja wspomagana sprzętowo, akceleratory kryptograficzne itp.) Wiem, że plik /proc/cpuinfo
zawiera te informacje w flags
linii, ale co oznaczają te wszystkie tajemnicze skróty?
Na przykład, biorąc pod uwagę następujący fragment /proc/cpuinfo
, czy mam 64-bitowy procesor? Czy mam wirtualizację sprzętu?
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
. Jest też doskonały interfejs CLI / GUI i-nex .cpufeatures.h
. Opisy są edytowane, aby uczynić je bardziej zrozumiałymi i bardziej pouczającymi, gdy ktoś starał się to zrobić.features
, nie widzę ich w tym pliku.RAMIĘ
W procesorach ARM w
features:
linii wymieniono kilka funkcji . Wspomniane są tylko funkcje bezpośrednio związane z architekturą ARM, a nie funkcje specyficzne dla producenta krzemu lub systemu na chipie.Funkcje są uzyskiwane z wyszukiwania identyfikatora procesora za pomocą
read_cpuid()
i wyszukiwania w definicjach typów procesorów znanych w czasie kompilacji, gdzie cechy są wyrażane jako maskaHWCAP_xxx
flag. Odpowiednie ciągi znaków znajdują się whwcap_str
itdsetup.c
. W.Na poniższej liście ARMv6 wprowadził instrukcje SIMD i typy danych. ARMv7 dostarczył zaawansowane instrukcje SIMD i typy danych. Na 32-bitowych maszynach ARM
neon
sygnalizuje Advanced SIMD; podczas gdyasimd
wysyła sygnały Advanced SIMD na 64-bitowych urządzeniach z ramieniem.swp
:SWP
instrukcja ( atomowy odczyt-modyfikacja-zapis )half
: Ładuje i zapisuje pół słowathumb
: Thumb (16-bitowy zestaw instrukcji)26bit
: Model „26-bitowy” (rejestr statusu procesora złożony do licznika programu)fastmult
: 32 × 32 → 64-bitowe mnożeniefpa
: Akcelerator zmiennoprzecinkowyvfp
: VFP (wczesne instrukcje zmiennoprzecinkowe wektorowe SIMD )edsp
: Rozszerzenia DSP (wariant „e” procesorów ARM9 i wszystkich innych powyżej)java
: Jazelle (akcelerator kodu bajtowego Java)iwmmxt
: Instrukcje SIMD podobne do Intel MMXcrunch
: Koprocesor MaverickCrunch (jeśli obsługa jądra jest włączona)thumbee
: ThumbEEneon
: Advanced SIMD / NEON (asimd
w starszych jądrach AArch64)vfpv3
: VFP wersja 3vfpv3d16
: VFP wersja 3 z 16 rejestrami D.tls
: Rejestr TLSvfpv4
: VFP wersja 4 z szybkim przełączaniem kontekstuidiva
:SDIV
iUDIV
podział sprzętu w trybie ARMidivt
:SDIV
iUDIV
podział sprzętu w trybie Thumbvfpd32
: VFP z 32 rejestrami D.lpae
: Duże rozszerzenie adresu fizycznego (> 4 GB pamięci fizycznej w architekturze 32-bitowej)evtstrm
: strumień zdarzeń jądra przy użyciu ogólnego timera architektonicznegoaes
: przyspieszanie sprzętowe AES (kryptografia tajnego klucza)pmull{2}
: 64 × 64 → 128-bitowe mnożenie F 2 m - przyspieszenie dla trybu uwierzytelnionego szyfrowania GCMsha1
: SHA-1 z akceleracją sprzętowąsha2
: przyspieszany sprzętowo SHA-256crc32
: CRC-32 z akceleracją sprzętowąPoza tym
Hardware:
linia wskazuje model procesora. W zależności od modelu, mogą istnieć inne informacje w innych plikach poniżej/proc
lub/sys
lub w wiadomościach dziennika jądra boot-czasowych. Niestety, każdy producent procesora ARM ma własną metodę raportowania funkcji procesora, jeśli takie istnieją.źródło
x86
Znajdź go sam w 4.1.3 x86 i podręczniku Intela
arch/x86/include/asm/cpufeature.h
zawiera pełną listę.Zdefiniowane wartości są typu:
Na przykład:
Flagi funkcji, wyodrębnione z CPUID, są przechowywane w:
__u32 x86_capability[NCAPINTS + NBUGINTS];
polestruct cpuinfo_x86 boot_cpu_data
x86/kernel/setup.c
który jest inicjowany przez
__init
funkcje.Skąd
x86_capability
pochodzi każdy element tablicy:Uwagi:
index
: jest indeksemx86_capability
npx86_capability[0]
eax
iexc
: są wartościami wejściowymi dla CPUID w systemie szesnastkowym. Wejści, które używająexc
, których jest mniej, nazywają je podpodłogami (drzewa 2-poziomowego zeax
rdzeniem).output
: jest rejestrem, z którego pobierane jest dane wyjściowe CPUIDfile
: to plik, w którym zdefiniowano te pola. Ścieżki są względnearch/x86/kernel/cpu/
.transmeta
: to nazwa dostawcy procesora https://en.wikipedia.org/wiki/Transmeta, który został przejęty przez Novafora https://www.crunchbase.com/organization/novaforacentaur
: to nazwa dostawcy procesora https://en.wikipedia.org/wiki/Centaur_Technology, która została przejęta przez VIA https://en.wikipedia.org/wiki/VIA_Technologies . Cyrix jest kolejnym.Wnioski:
większość wpisów pochodzi bezpośrednio z rejestrów wyjściowych CPUID i jest ustawiana
common.c
przez coś takiego:Można je łatwo znaleźć wsadowo w instrukcji Intel dla CPUID.
pozostałe są rozproszone po źródle i są ustawiane krok po kroku
set_cpu_cap
.Aby je znaleźć, użyj
git grep X86_FEATURE_XXX
wewnątrzarch/x86
.Zazwyczaj można wywnioskować, jaki bit CPUID odpowiadają, z otaczającego kodu.
Inne zabawne fakty
Flagi są w rzeczywistości drukowane
arch/x86/kernel/cpu/proc.c
z kodem:Gdzie:
cpu_has
wykonuje główne sprawdzenie funkcji.x86_cap_flags[i]
zawiera ciągi, które odpowiadają każdej fladze.Zostaje to przekazane jako wywołanie zwrotne do
proc
konfiguracji systemu. Punkt wejścia znajduje się wfs/proc/cpuinfo.c
.x86_cap_flags
ciągi są generowanearch/x86/kernel/cpu/mkcapflags.h
bezpośrednio zarch/x86/include/asm/cpufeature.h
„parsowania” go za pomocąsed
...Dane wyjściowe trafiają do
arch/x86/kernel/cpu/capflags.c
katalogu kompilacji, a wynikowa tablica wygląda następująco:więc na przykład
X86_FEATURE_FPU
odpowiada ciągowi"fpu"
i tak dalej.cpu_has
dzieli się na dwa przypadki z kodem:Oni są:
__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit)
: flaga jest wymagana do uruchomienia jądra.Jest to określone przez dane wewnątrz
required-features.h
, które komentują:Ponieważ są one znane w czasie kompilacji (wymagania jądra), zostały już sprawdzone podczas uruchamiania, sprawdzenie można rozwiązać w czasie kompilacji, jeśli
bit
jest znane w czasie kompilacji.Zatem,
__builtin_constant_p(bit)
który sprawdza, czybit
jest stałą czasową kompilacji.test_cpu_cap
: zużywaCPUID
dane zstruct cpuinfo_x86 boot_cpu_data
globalnegoźródło
cpuid
robi to w wygodniejszy sposób. Zadałem to pytanie, aby mieć miejsce, w którym nazwiska są udokumentowane.Lub alternatywnie możesz użyć
cpuid
programu, musi on znajdować się w repozytorium debian. Zrzuca wszystkie możliwe informacje o twoim CPU z kilkoma wyjaśnieniami, więc nie otrzymujesz tych niejasnych flag.źródło
cpuid
rozszerza skróty. Nie nazwałbym tak naprawdę wyjaśnieniami wyjściowymi . Wiedza, żeht
to oznacza „Hyper Threading”, wyjaśnia to w pewnym stopniu, ale wiedza, żemmx
to oznacza „zestaw instrukcji MMX”, nie tyle, a tomca
oznacza „Machine Check Architecture”.