Как я могу определить, есть ли у моего процессора особая функция? (64-битный набор команд, аппаратная виртуализация, криптографические ускорители и т. Д.) Я знаю, что файл /proc/cpuinfo
содержит эту информацию в flags
строке, но что означают все эти загадочные сокращения?
Например, учитывая следующее извлечение из /proc/cpuinfo
, у меня есть 64-битный процессор? Есть ли у меня аппаратная виртуализация?
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
. И есть также превосходный CLI / GUI i-nex .cpufeatures.h
. Описания отредактированы, чтобы сделать их более понятными и информативными, когда кто-то предпринял усилия, чтобы сделать это.features
я не вижу их в этом файле.РУКА
На процессорах ARM в
features:
строке упоминается несколько функций . Здесь упоминаются только функции, непосредственно связанные с архитектурой ARM, а не функции, характерные для производителя кремния или системы на кристалле.Функции получены путем поиска идентификатора процессора
read_cpuid()
и поиска его в определениях типов процессоров, известных во время компиляции, где функции выражаются в виде маскиHWCAP_xxx
флагов. Соответствующие строки находятся вhwcap_str
и тsetup.c
. Д. В.В приведенном ниже списке ARMv6 представил инструкции и типы данных SIMD. ARMv7 предоставил расширенные инструкции SIMD и типы данных. На 32-битных ARM машинах,
neon
сигналы Advanced SIMD; в то время какasimd
сигналы Advanced SIMD на машинах 64-битной руки.swp
:SWP
инструкция ( атомарное чтение-изменение-запись )half
: Половина слова загружает и хранитthumb
: Большой палец (16-битный набор инструкций)26bit
: Модель "26 бит" (регистр состояния процессора, сложенный в счетчик программы)fastmult
: 32 × 32 → 64-битное умножениеfpa
: Ускоритель с плавающей точкойvfp
: VFP (ранние SIMD векторные инструкции с плавающей точкой)edsp
: Расширения DSP (вариант 'e' для процессоров ARM9 и все остальные, перечисленные выше)java
: Jazelle (ускоритель байт-кода Java)iwmmxt
: Инструкции SIMD аналогичны Intel MMXcrunch
: MaverickCrunch сопроцессор (если включена поддержка ядра)thumbee
: ThumbEEneon
: Расширенный SIMD / NEON (asimd
в старых версиях AArch64)vfpv3
: VFP версия 3vfpv3d16
: VFP версия 3 с 16 D-регистрамиtls
: Регистрация TLSvfpv4
: VFP версии 4 с быстрым переключением контекстаidiva
:SDIV
иUDIV
аппаратное подразделение в режиме ARMidivt
:SDIV
иUDIV
аппаратное деление в режиме Thumbvfpd32
: VFP с 32 D-регистрамиlpae
: Большое расширение физических адресов (> 4 ГБ физической памяти в 32-разрядной архитектуре)evtstrm
: поток событий ядра с использованием общего таймераaes
: аппаратно-ускоренная AES (криптография с секретным ключом)pmull{2}
: 64 × 64 → 128-битное умножение F 2 m - ускорение для режима аутентифицированного шифрования GCMsha1
: аппаратно-ускоренный SHA-1sha2
: аппаратно-ускоренный SHA-256crc32
: аппаратно-ускоренный CRC-32Кроме того,
Hardware:
линия указывает модель процессора. В зависимости от модели, может быть другая информация в других файлах в/proc
или/sys
, или в сообщениях журнала ядра во время загрузки. К сожалению, у каждого производителя процессоров ARM есть свой собственный метод сообщения о возможностях процессора, если таковые имеются.источник
x86
Найдите это сами в 4.1.3 x86 и руководстве Intel
arch/x86/include/asm/cpufeature.h
содержит полный списокОпределить значения имеют тип:
Например:
Флаги функций, извлеченные из CPUID, хранятся внутри:
__u32 x86_capability[NCAPINTS + NBUGINTS];
полеstruct cpuinfo_x86 boot_cpu_data
x86/kernel/setup.c
который инициализируется через
__init
функции.Откуда происходит каждый
x86_capability
элемент массива:Примечания:
index
: это индексx86_capability
, например,x86_capability[0]
eax
иexc
: входные значения для CPUID в шестнадцатеричном формате. Входы, которые используютexc
, которых меньше, называют это подзаголовком (двухуровневого дерева сeax
корнем).output
: регистр, из которого берется вывод CPUIDfile
: файл, в котором определены эти поля. Пути относительноarch/x86/kernel/cpu/
.transmeta
: было имя поставщика процессора https://en.wikipedia.org/wiki/Transmeta, которое было приобретено Novafora https://www.crunchbase.com/organization/novaforacentaur
: было имя поставщика процессора https://en.wikipedia.org/wiki/Centaur_Technology, которое было приобретено VIA https://en.wikipedia.org/wiki/VIA_Technologies . Cyrix это еще один.Выводы:
большинство записей поступают непосредственно из выходных регистров CPUID и задаются
common.c
чем-то вроде:Их легко найти в пакете по руководству Intel для CPUID.
остальные разбросаны по всему источнику и устанавливаются постепенно
set_cpu_cap
.Чтобы найти их, используйте
git grep X86_FEATURE_XXX
внутриarch/x86
.Обычно вы можете определить, каким битам CPUID они соответствуют, из окружающего кода.
Другие забавные факты
Флаги на самом деле печатаются
arch/x86/kernel/cpu/proc.c
с кодом:Где:
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
в каталог сборки, а результирующий массив выглядит так:так например
X86_FEATURE_FPU
соответствует строка"fpu"
и так далее.cpu_has
разбивается на два случая с кодом:Они есть:
__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit)
: флаг необходим для запуска ядра.Это определяется данными внутри
required-features.h
, которые комментируют:Поскольку они известны во время компиляции (требования ядра), уже были проверены при запуске, проверка может быть решена во время компиляции, если
bit
она известна во время компиляции.Таким образом,
__builtin_constant_p(bit)
который проверяет,bit
является ли постоянная времени компиляции.test_cpu_cap
: это используетCPUID
данные изstruct cpuinfo_x86 boot_cpu_data
глобальногоисточник
cpuid
делает это более удобным способом. Я задал этот вопрос, чтобы иметь место, где имена задокументированы.Или же вы можете использовать
cpuid
программу, она должна быть в репозитории Debian. Он выводит всю возможную информацию о вашем процессоре с некоторыми пояснениями, поэтому вы не получите эти непонятные флаги.источник
cpuid
расширяет аббревиатуры. Я бы не стал называть его выходными объяснениями . Знание этогоht
означает, что «Hyper Threading» объясняет это в некоторой степени, но знание того, чтоmmx
означает «набор инструкций MMX», не так много, и этоmca
означает, что «Архитектура проверки компьютера» вряд ли.