x86のCPUIDについて

後期のi486以降でサポートされているCPUIDですが、これがどのように動作するかを見てみます。

 

Intelのマニュアルを見つつ。

www.intel.com

 

Vol.2 Chapter3でCPUIDについて詳しく書いてあります。

当然ながら、この命令は32bit/64bitのモードでしか機能しません。

 要約してみると、

  1. CPUIDが使えるかをEFLAGSレジスタのbit 21が示す。このフラグがセットしてクリアできれば、CPUIDを使うことができる。
  2. CPUIDによって提供される情報はEAX, EBX, ECX, EDXレジスタに返される。
  3. CPUIDを実行する前にEAXやECXに値をセットすることで提供される情報が変わる。
  4. サポートされていない値がEAXにセットされていた場合は全てのレジスタに0がセットされる。

といったところでしょうか。

 では/proc/cpuinfoのflagsの情報のもととなっているものはどうなっているのかを見てみます。

EAX=01Hとした場合にECX, EDXのそれぞれの機能に対応したビットがセットされます。

さすがに32bit×2=64bit全てをここに示すのは難しいのでやりませんが、その例として、

  • ECXのbit 5がセットされていれば、Virtual Machine Extensionsをサポートしていたり。
  • EDXのbit 0がセットされていればx87のFPUを含んでいたり。

するようです。

すごいそれっぽいです。

ほかにも、キャッシュなどの情報も得られるようです。

面白いのは、実行前のEAXがとれる値が00Hから16Hまでは普通にあるのですが、80000000H以降があることです。どうやらこの部分はAMDが昔から使っているようです。現在ではIntelも使っています。この80000000H以降はExtended Processor Information(拡張プロセッサ情報?)と呼ばれ、80000000HをセットしてCPUIDを実行することでEAXにそのとれる最大値が取得できるみたいです。(おそらくですが、IntelIA-64とかやってたときに提案されたAMD64で割り当てられたのだと思います。)

 

codezine.jp

上のリンクと現在のものと比較すると、かなり拡張されていることが分かります。