プログラミング VC++によるDLLとVisual Basic/C++ BuilderでGUIを作成 CPU種別を認識し,プロセッサシリアル番号 北山 洋幸 連続して,WindowsからI/O制御を紹介しています.今度はI/Oではありませんが,インテル系CPUのCPUID命令を使った,プロセッサの詳細を探るプログラムを作ってみます.
|
インテルアーキテクチャは,新しい世代や新しいモデルのプロセッサ(8086,8088,Intel286,Intel386,
Intel486, Pentium,MMX Pentium,Pentium Pro,Pentium II,Pentium II Xeon,Celeron,
Pentium III)の登場とともに進展してきました.当初は,プロセッサインプリメントの多少の違いを使って,CPUを判別していました.筆者もMS-DOS時代に,CPU判別プログラムを作成し,パソコン雑誌にコラムを執筆したことがあります.
しかし,CPUアーキテクチャの驚異的な発展に伴い,各プロセッサを識別する,洗練された手段が必要になりました.現在では,プロセッサに「CPUID」という命令が追加され,プロセッサの識別が簡単になりました.
CPUID命令の検出
Intel486ファミリ以降のインテルプロセッサでは,EFLAGSレジスタの,ビット21
のIDフラグにより,CPUID命令を実行可能か,簡単に調べることができます.今回紹介するプログラムも,この方法を使います.ソフトウェア上でこのフラグの値を変更することができれば,そのプロセッサはCPUID命令を実行できます.図1を参照してください.
FLAGSレジスタや,EFLAGSレジスタへのアクセスは,POPF,POPFD,PUSHF,PUSHFDの各命令を使用します.直接,データをフラグレジスタへ書き込むことはできません.このプログラムに,PUSHFD命令でIDフラグの値を読み取り,POPFD命令で変更する方法が入っています.
CPUID命令の出力
CPUID命令の出力を表1に示します.EAXレジスタに機能番号を設定して,CPUID命令を実行すると,機能番号に従ったCPUID命令が所定の機能を実行します.すべてのCPUが,全部の機能を実行できるわけではありません.
EAXレジスタへ“0”を設定して,CPUID命令を実行すると,最大機能番号を得ることができます.EAXに最大値が返されますので,以降の呼び出しでは,戻り値以下の値を使用しなければなりません.EAXレジスタに最大値が戻されるのに加え,ベンダーID文字列を受け取ることができます.EBX,EDX,ECXの各レジスタに,ベンダーID文字列も戻されます.これらのレジスタには,以下のASCII文字列が格納されます.
GenuineIntel
どのように,格納されるかは,ソースプログラムを参照してください.インテルアーキテクチャの互換品は,このCPUID命令を提供することができます.CPUID命令を実行したときに,“GenuineIntel”文字列が戻されない場合,CPUID命令は,インテル製品と互換性がないかもわかりません.
プログラムの構造
プログラムは,CPUIDを実行するDLL部と,GUIを担当する部分に分かれています.そして,GUI部をC++ Builderで作成したものと,Visual Basicで作成したものの2種類があります(図2).
DLLの開発(Cpuid\Cpuiddll)
プログラムは,CPUIDを実行する部分をDLLにします.DLLは,Visual C++を使って開発します.Visual C++を使って,DLLを開発する手順を示します.
● AppWizard
Visual C++を起動したら,「ファイル」→「新規作成」を押して,「新規作成」ダイアログを表示させます(図3).
「プロジェクト」タブを押し,「Win32 Dynamic-Link Library」を選択します.このとき,DLLの名前も入力します.プラットフォームはWin32を使用します(図4).
「Win32 Dynamic-Link Library 1/1」が現れます.「単純なDLLプロジェクト」を選んで,終了を押してください(図5).
新規プロジェクト情報が表示されます.内容をチェックして,誤りがなければOKを押します(図6).
ここまでのWizardの操作で作成された内容を,ワークスペースのFileViewで参照してみます(図7).
FileViewの状態で,右マウスボタンをクリックすると,ポップアップメニューが現れます(図8).
「ファイルをプロジェクトへ追加」を選び,DEFファイルや,ヘッダーファイルを追加します(図9).
ここまでの,操作でDLLのスケルトンができあがりました.あとは,ソースプログラムを変更します.
以下略
copyright 1999 北山洋幸