/ proc / cpuinfoのフラグはどういう意味ですか?


212

プロセッサに特定の機能があるかどうかを確認するにはどうすればよいですか?(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

回答:


275

x86

(32ビット別名i386–i686および64ビット別名amd64。つまり、ワークステーション、ラップトップ、またはサーバー。)

FAQ:持っていますか…

  • 64ビット(x86_64 / AMD64 / Intel64)? lm
  • ハードウェア仮想化(VMX / AMD-V)?vmx(Intel)、svm(AMD)
  • 加速AES(AES-NI)? aes
  • TXT(TPM)? smx
  • ハイパーバイザー(そのように発表された)? hypervisor

他の機能のほとんどは、コンパイラまたはカーネルの作成者のみが関心を持っています。

すべてのフラグ

完全なリストは、カーネルソースのファイルにありますarch/x86/include/asm/cpufeatures.h

Intel定義のCPU機能、CPUIDレベル0x00000001(edx)

WikipediaおよびIntel Advanced Vector Extensions Programming Referenceの表2-27 も参照してください。

AMD定義のCPU機能、CPUIDレベル0x80000001

WikipediaおよびIntel Advanced Vector Extensions Programming Referenceの表2-23 も参照してください。

Transmeta定義のCPU機能、CPUIDレベル0x80860001

  • recovery:リカバリモードのCPU
  • longrun:ロングラン電力制御
  • lrti:LongRunテーブルインターフェイス

その他の機能、Linux定義のマッピング

  • cxmmx:Cyrix MMX拡張
  • k6_mtrr:AMD K6非標準MTRR
  • cyrix_arr:Cyrix ARR(= MTRR)
  • centaur_mcr:ケンタウルスMCR(= MTRR)
  • constant_tsc:TSCは一定のレートでティックします
  • up:UPで実行されているSMPカーネル
  • art:常時実行タイマー
  • arch_perfmon:Intel Architectural PerfMon
  • pebs:正確なイベントベースのサンプリング
  • bts:ブランチトレースストア
  • rep_good:repマイクロコードはうまく機能します
  • acc_powerAMD累積力メカニズム
  • nopl:NOPL(0F 1F)命令
  • xtopology:CPUトポロジ列挙拡張
  • tsc_reliableTSCは信頼できることが知られています
  • nonstop_tscTSCはC状態で停止しません
  • cpuid:CPUにはCPUID命令があります
  • extd_apicid:拡張されたAPICID(8ビット)
  • amd_dcm:マルチノードプロセッサ
  • aperfmperf:APERFMPERF
  • eagerfpu:非遅延FPU復元
  • nonstop_tsc_s3TSCはS3状態で停止しません
  • tsc_known_freqTSCには既知の周波数があります
  • mce_recovery:CPUには回復可能なマシンチェックがあります

Intel定義のCPU機能、CPUIDレベル0x00000001(ecx)

WikipediaおよびIntel Advanced Vector Extensions Programming Referenceの表2-26 も参照してください。

VIA / Cyrix / Centaur定義のCPU機能、CPUIDレベル0xC0000001

  • rng乱数ジェネレーターの存在(xstore)
  • rng_en乱数ジェネレーターが有効
  • ace:オンCPU暗号化(xcrypt)
  • ace_en:オンCPU暗号化が有効
  • ace2:高度な暗号化エンジンv2
  • ace2_en:ACE v2が有効
  • phe:PadLockハッシュエンジン
  • phe_en:PHE対応
  • pmm:PadLock Montgomery Multiplier
  • pmm_en:PMMが有効

より拡張されたAMDフラグ:CPUIDレベル0x80000001、ecx

  • lahf_lm:ロングモードでフラグからAHをロード(LAHF)およびフラグにAHを保存(SAHF)
  • cmp_legacy:はいの場合、ハイパースレッディングは無効です
  • svm:「セキュアな仮想マシン」:AMD-V
  • extapic:拡張APICスペース
  • cr8_legacy:32ビットモードのCR8
  • abm高度なビット操作
  • sse4aSSE-4A
  • misalignsse:一部のレガシーSSE命令がアライメントされていないデータで動作するときに、一般保護例外(#GP)が生成されるかどうかを示します。CR0およびアライメントチェックビットにも依存
  • 3dnowprefetch:3DNowプリフェッチ命令
  • osvwOS Visible Workaroundを示します。これにより、OSはプロセッサのエラータを回避できます。
  • ibs命令ベースのサンプリング
  • xop拡張AVX命令
  • skinit:SKINIT / STGI命令
  • wdtウォッチドッグタイマー
  • lwp軽量プロファイリング
  • fma44オペランドMAC命令
  • tce:翻訳キャッシュ拡張
  • nodeid_msr:NodeId MSR
  • tbmトレーリングビット操作
  • topoext:トポロジー拡張CPUIDリーフ
  • perfctr_core:コアパフォーマンスカウンター拡張
  • perfctr_nb:NBパフォーマンスカウンター拡張
  • bpext:データブレークポイント拡張
  • ptsc:パフォーマンスタイムスタンプカウンター
  • perfctr_l2:L2パフォーマンスカウンター拡張
  • mwaitxMWAIT拡張子(MONITORX/ MWAITX

補助フラグ:Linux定義-さまざまなCPUIDレベルに散在する機能用

  • ring3mwait:リング3 MONITOR / MWAIT
  • cpuid_fault:Intel CPUIDエラー
  • cpb:AMDコアパフォーマンスブースト
  • epb:IA32_ENERGY_PERF_BIASのサポート
  • cat_l3:キャッシュ割り当てテクノロジーL3
  • cat_l2:キャッシュ割り当てテクノロジーL2
  • cdp_l3:コードとデータの優先順位付けL3
  • invpcid_single:効果的invpcidCR4.PCIDE=1
  • hw_pstate:AMD HW-PState
  • proc_feedback:AMD ProcFeedbackInterface
  • sme:AMDセキュアメモリ暗号化
  • ptiカーネルページテーブル分離(Kaiser)
  • retpolineSpectreバリアント2のRetpoline緩和(間接分岐)
  • retpoline_amd:AMD Retpolineの緩和
  • intel_ppin:Intelプロセッサインベントリ番号
  • avx512_4vnniw:AVX-512ニューラルネットワークの手順
  • avx512_4fmaps:AVX-512乗算累積単精度
  • mba:メモリ帯域幅の割り当て
  • rsb_ctxsw:コンテキストスイッチでRSBを埋める

仮想化フラグ:Linux定義

  • tpr_shadow:インテルTPRシャドウ
  • vnmi:Intel Virtual NMI
  • flexpriority:Intel FlexPriority
  • ept:Intel拡張ページテーブル
  • vpid:Intel仮想プロセッサID
  • vmmcall:好みVMMCALLVMCALL

Intel定義のCPU機能、CPUIDレベル0x00000007:0(ebx)

拡張状態機能、CPUIDレベル0x0000000d:1(eax)

  • xsaveopt:最適化 XSAVE
  • xsavecXSAVEC
  • xgetbv1XGETBVECX = 1を使用
  • xsavesXSAVES/XRSTORS

Intel定義のCPU QoSサブリーフ、CPUIDレベル0x0000000F:0(edx)

  • cqm_llc:LLC QoS

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)

  • clzeroCLZERO指導
  • irperf:廃止された命令のパフォーマンスカウンター
  • xsaveerptr:FPエラーポインターを常に保存/復元する

熱および電源管理リーフ、CPUIDレベル0x00000006(eax)

  • dtherm(以前dts):デジタル熱センサー
  • ida:Intel Dynamic Acceleration
  • arat:常にAPICタイマーを実行する
  • pln:Intelの電力制限通知
  • pts:Intelパッケージの温度ステータス
  • hwp:Intelハードウェア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:AMD flush-by-ASIDサポート
  • decodeassists:AMD Decode Assistsのサポート
  • pausefilter:AMDフィルター処理された一時停止インターセプト
  • pfthreshold:AMD一時停止フィルターのしきい値
  • avic:仮想割り込みコントローラー
  • vmsave_vmload:仮想VMSAVE VMLOAD
  • vgif:仮想GIF

Intel定義のCPU機能、CPUIDレベル0x00000007:0(ecx)

  • avx512vbmi:AVX512ベクトルビット操作手順
  • umip:ユーザーモード命令保護
  • pku:ユーザースペースの保護キー
  • ospke:OS保護キーの有効化
  • 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定義)

  • f00fIntel F00F
  • fdivCPU FDIV
  • comaCyrix 6x86コマ
  • amd_tlb_mmatchtlb_mmatchAMDエラッタ383
  • amd_apic_c1eapic_c1eAMD Erratum 400
  • 11ap:悪いローカルAPIC別名11AP
  • fxsave_leak:FXSAVEがFOP / FIP / FOPをリークする
  • clflush_monitor:AAI65、MONITORの前にCLFLUSHが必要
  • sysret_ss_attrs:SYSRETはSS属性を修正しません
  • espfix: "" 16ビットSSへのIRETがESP / RSP上位ビットを破損します
  • null_seg:セレクターをnullにすると、ベースが保持されます
  • swapgs_fence:GSで入力依存関係のないSWAPGS
  • monitor:リモートCPUをウェイクアップするためにIPIが必要
  • amd_e400:CPUはErratum 400の影響を受けます
  • cpu_meltdown:CPUはメルトダウン攻撃の影響を受け、カーネルページテーブルの分離が必要
  • spectre_v1:CPUは、条件分岐を伴うSpectreバリアント1攻撃の影響を受けます
  • spectre_v2:CPUは、間接分岐によるSpectreバリアント2攻撃の影響を受けます
  • spec_store_bypass:CPUは、投機的ストアバイパスの脆弱性(Spectreバリアント4)の影響を受けます。

PSこのリストはarch/x86/include/asm/cpufeatures.h、カーネルソースに由来します。フラグは、ソースコードと同じ順序でリストされています。欠落している機能の説明へのリンクを追加したり、表現力に欠ける名前を持つ機能の簡単な説明を書いたり、新しいカーネルバージョンのリストを更新したりしてください。現在のリストはLinux 4.15に加えていくつかの追加されたものです。


1
有益な質問とその要約された詳細な回答を@Gillesと編集者に感謝します。ここで、CPUの能力を確認するために、NixCraftから取得した次のものを使用します(Intel CPUなど)$ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u。また、CLI / GUIの優れたi-nexもあります。
tuk0z

説明とリンクの優れたコレクション。貢献してくれたみんなに感謝します。
ポール・ギア

バグデータはどこから来たのですか?cpufeatures.hファイルにリストされていないようです。
ドラジシル

@Drazisil私が覚えている限り、すべてのエントリはのバージョンからのものですcpufeatures.h。説明は、誰かがそれを行うために努力した場所で、よりわかりやすく、より有益になるように編集されます。
ジル

@Gillesそれはバグを除くすべてのケースに当てはまるようです。それらがそうでないfeaturesことは別として、私はそのファイルにそれらを見ません。
ドラジシル

71

ARMプロセッサでは、いくつかの機能がfeatures:行に記載されています。そこにはARMアーキテクチャに直接関連する機能のみが記載されており、シリコンメーカーまたはシステムオンチップに固有の機能は記載されていません。

機能は、CPU IDを検索しread_cpuid()、コンパイル時に既知のプロセッサタイプ定義で検索することで取得されます。この場合、機能はHWCAP_xxxフラグのマスクとして表されます。対応する文字列はhwcap_strなどにありsetup.cます。

以下のリストで、ARMv6はSIMD命令とデータ型を導入しました。ARMv7はAdvanced SIMD命令とデータ型を提供しました。32ビットARMマシンでは、neonAdvanced SIMDを通知します。一方asimd、64ビットアームマシンでAdvanced SIMDを通知します。

それを超えて、Hardware:線はプロセッサモデルを示します。モデルによっては、下の他のファイル内の他の情報があるかもしれない/proc/sys、または起動時のカーネルログメッセージに。残念ながら、ARM CPUの各メーカーは、もしあれば、プロセッサ機能を報告する独自の方法を持っています。



11

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    |

ノート:

結論:

  • ほとんどのエントリはCPUID出力レジスタから直接取得されcommon.c、次のようなものによって設定されます。

    c->x86_capability[0] = edx;
    

    これらは、CPUIDのIntelマニュアルでバッチで簡単に見つけることができます。

  • 他はソース全体に散在し、でビットごとに設定されます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 コードでは2つのケースに分けられます。

    #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使い果たします


3
略語から長い名前に変更する方法を説明しましたが、多くの場合、その長い名前はあまり理解できずcpuid、より便利な方法でそれを行います。名前を文書化する場所があるように、私はその質問をしました。
ジル

@Gillesこれは主に、テーブルを作成したい/私のようにテーブルで機能を見つけることができない人向けです:-)それでも、ほとんどの場合、ソースの正しいポイントを見ると、CPUIDへのマップは即時。
Ciro Santilli新疆改造中心法轮功六四事件

10

またはcpuid、プログラムを使用することもできます。それはdebianリポジトリになければなりません。CPUに関する可能性のあるすべての情報がいくつかの説明とともにダンプされるため、これらのあいまいなフラグは表示されません。


cpuid略語を展開します。私は実際にその出力の説明を呼び出しません。それがht「ハイパースレッディング」であることを知っていることmmxはある程度説明していますが、それは「MMX命令セット」を意味していることを意味し、それほど多くはありませんmca
ジル

6
@Gilles ...そして、まだ「Machine Check Architecture」は「mca」よりもGoogleの方が確かに優れています;)
Alois Mahdal 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.