CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

CPUID取得

CUPIDはプロセッサの諸元を取り出す命令ですが、386ボードで実行しようとしたら動きません。
調べてみたらCPUIDを正式にサポートしているのはPentium以降、Intel486プロセッサでは
後期のものだけで、386で実行すると無効オペコード例外になってしまうようです。

そこで486ボードで実行してみました。
CPUID命令はインラインアセンブラで記述しなければなりません。

long getid0(unsigned char *buf)
{
	int i;
	
	asm("movl $0,%eax");
	asm("cpuid");
	asm("movl %ebx,_ebx");
	asm("movl %edx,_edx");
	asm("movl %ecx,_ecx");
	asm("movl %eax,_eax");

	for(i=0;i<4;i++){
		*buf++=(ebx & 0xff);
		ebx >>= 8;
	}
	for(i=0;i<4;i++){
		*buf++=(edx & 0xff);
		edx >>= 8;
	}
	for(i=0;i<4;i++){
		*buf++=(ecx & 0xff);
		ecx >>= 8;
	}
	*buf++=0;
	return eax;
}

EAXに機能コードをセットしてCPUID命令を実行するとレジスタに値がセットされてきます

イメージ 1


EAX=0で実行するとEBX,EDX,ECXにベンダIDストリング「GenuineIntel」がセットされています
このときのEAXの値1は機能番号1までサポートしていることを示します

そこで次にEAX=1で実行するとEAXにプロセッサシグネチャ0x0436が返り、
これから

 ファミリコード=0100
 モデル番号  =0011 
 ステッピングID=0110          

より IntelDX2プロセッサ、ステッピング6ということがわかります。

また同時にEDXには機能フラグ0x000Bがセットされていて
これは

 0 FPU オンチップの浮動小数点ユニット Intel387™ プロセッサ浮動小数点命令セットをサポート
 1 VME 仮想モード拡張機能  プロセッサは仮想8086 モード拡張機能をサポートしている。
 3 PSE ページサイズ拡張機構 プロセッサは4M バイトページをサポートしている。
を意味しています