TrickLibrary
  1. http://tricklib.com/
  2. cxx/
  3. ex/
  4. ia32info/

ia32info

about ia32info

ia32info は 32 ビットベースのインテルアーキテクチャの CPU 情報を取得するモジュールです。

使用方法

下のリンクから ia32info.h と ia32info.cpp をダウンロードして、ia32info を使用したいモジュール内で ia32info.h をインクルードし、ia32info.cpp をコンパイル&リンクするだけです。 お手軽に組み込みたい場合は、ia32info.h の代わりに ia32info.cpp をインクルードするのもありです。(リンクする翻訳単位が複数ある場合、ia32info.cppをインクルードするのは全体で一度だけにしてください。)

ダウンロード

ia32info 本体 全ファイルパック

使用例

#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 とインテルの資料を参考にしてください。

macro

マクロ名種別説明
__IA32INFO_H__自動定義ia32info.h の重複インクルード対策の為に使用されています。
__TEST_IA32INFO__ユーザ定義ia32info を単体でテストしたい場合はこのマクロを定義して ia32info.cpp をコンパイルすれば、コンソールアプリとして実行できます。(上記使用例のコードが活きます。)

links