ia32info は 32 ビットベースのインテルアーキテクチャの CPU 情報を取得するモジュールです。
下のリンクから ia32info.h と ia32info.cpp をダウンロードして、ia32info を使用したいモジュール内で ia32info.h をインクルードし、ia32info.cpp をコンパイル&リンクするだけです。 お手軽に組み込みたい場合は、ia32info.h の代わりに ia32info.cpp をインクルードするのもありです。(リンクする翻訳単位が複数ある場合、ia32info.cppをインクルードするのは全体で一度だけにしてください。)
#include "ia32info.h"
int main() {
using namespace ia32info;
const char *bool_value_name[] = {
"false", "true"
};
const bool X_enabled_cpuid = enabled_cpuid();
printf("cpuid命令の実装: %s\n", bool_value_name[X_enabled_cpuid]);
if (X_enabled_cpuid) {
const unsigned int max_index = cpuid_baseinfo_maxindex();
printf("cpuid - 基本情報最大インデックス: 0x%X\n", max_index);
printf("CPU のベンダID: %s\n", cpuid_venderid().get_string());
if (1 <= max_index) {
const cpuid_signature signature;
printf("ステッピングID: 0x%X\n", signature.stepping_id());
printf("モデル番号: 0x%X\n", signature.model_number());
printf("ファミリーコード: 0x%X\n", signature.family_code());
printf("プロセッサタイプ: 0x%X\n", signature.processor_type());
printf("拡張モデル: 0x%X\n", signature.ex_model());
printf("拡張ファミリ: 0x%X\n", signature.ex_family());
printf("ブランドID: 0x%X\n", signature.brand_id());
printf("ブランド名: %s\n", signature.brand_name());
printf("チャンク: 0x%X\n", signature.chunk());
printf("APIC ID: 0x%X\n", signature.apic_id());
printf("オンチップの浮動小数点演算ユニット: %s\n", bool_value_name[signature.fpu()]);
printf("仮想モード拡張: %s\n", bool_value_name[signature.vme()]);
printf("デバッグ機能拡張: %s\n", bool_value_name[signature.de()]);
printf("ページサイズ拡張: %s\n", bool_value_name[signature.pse()]);
printf("タイムスタンプカウンタ: %s\n", bool_value_name[signature.tsc()]);
printf("モデル固有レジスタ: %s\n", bool_value_name[signature.msr()]);
printf("物理アドレス拡張: %s\n", bool_value_name[signature.pae()]);
printf("マシンチェック例外: %s\n", bool_value_name[signature.mce()]);
printf("CMPXCHG8命令のサポート: %s\n", bool_value_name[signature.cx8()]);
printf("オンチップAPICハードウェアのサポート: %s\n", bool_value_name[signature.apic()]);
printf("高速システムコール: %s\n", bool_value_name[signature.sep()]);
printf("メモリタイプレンジレジスタ: %s\n", bool_value_name[signature.mtrr()]);
printf("ページグローバルイネーブル: %s\n", bool_value_name[signature.pge()]);
printf("マシンチェックアーキテクチャ: %s\n", bool_value_name[signature.mca()]);
printf("条件付移動命令のサポート: %s\n", bool_value_name[signature.cmov()]);
printf("ページ属性テーブル: %s\n", bool_value_name[signature.pat()]);
printf("36ビットページサイズ拡張: %s\n", bool_value_name[signature.pse_36()]);
printf("プロセッサシリアルナンバーのサポートとイネーブル: %s\n", bool_value_name[signature.psn()]);
printf("CLFLUSH命令のサポート: %s\n", bool_value_name[signature.clfsh()]);
printf("デバッグストア: %s\n", bool_value_name[signature.ds()]);
printf("温度モニタおよびソフトウェア制御されるクロック機能のサポート: %s\n", bool_value_name[signature.acpi()]);
printf("インテルアーキテクチャMMXテクノロジのサポート: %s\n", bool_value_name[signature.mmx()]);
printf("浮動小数点コンテキストの高速セーブ/リストア: %s\n", bool_value_name[signature.fxsr()]);
printf("ストリーミングSIMD拡張命令のサポート: %s\n", bool_value_name[signature.sse()]);
printf("ストリーミングSIMD拡張命令2のサポート: %s\n", bool_value_name[signature.sse2()]);
printf("セルフスヌープ: %s\n", bool_value_name[signature.ss()]);
printf("温度モニタのサポート: %s\n", bool_value_name[signature.tm()]);
if (3 <= max_index && signature.psn()) {
printf("プロセッサシリアルナンバー: %s\n", (const char *)cpuid_serial_number_string(signature));
}
}
const cpuid_extra_maxindex extra_maxindex;
const bool X_enabled_extra = extra_maxindex.enabled_extra();
printf("cpuid - 拡張機能のサポート: %s\n", bool_value_name[X_enabled_extra]);
if (X_enabled_extra) {
const unsigned int max_ex_index = extra_maxindex;
printf("cpuid - 拡張機能最大インデックス: 0x%X\n", max_ex_index);
const bool X_enabled_brand_string = extra_maxindex.enabled_brand_string();
printf("プロセッサブランドストリング機能のサポート: %s\n", bool_value_name[X_enabled_brand_string]);
if (X_enabled_brand_string) {
printf("プロセッサブランドストリング: %s\n", cpuid_processor_brand_string().get_string());
}
}
}
return 0;
}
| マクロ名 | 種別 | 説明 |
|---|---|---|
| __IA32INFO_H__ | ia32info.h の重複インクルード対策の為に使用されています。 | |
| __TEST_IA32INFO__ | ia32info を単体でテストしたい場合はこのマクロを定義して ia32info.cpp をコンパイルすれば、コンソールアプリとして実行できます。(上記使用例のコードが活きます。) |