当ブログではアフィリエイト広告を掲載しています。

Intel Microcodeの基礎

最終更新日

2019/12/08
「バグがあるMicrocode Update Revision情報」の章を追加・修正。
「Intel Microcodeについての解説」の章を書き直しました。(以前、誤って削除してしまいました。ごめんなさい)
2020/01/31
目次のリンク修正
2020/05/15
バグ情報 追加
2020/06/11
第5章 Intel Microcode Update Guidanceを更新
Intel CPU向けの記事です。

CPU製造後に不具合を修正するために作られた仕組み

Intel製CPUはmicrocodeを内蔵しており、マシン起動時に修正プログラム(Microcode Update)を適用します。それにより、CPUのエラッタ(Errata: 欠陥、不具合)をある程度修正することができます。

(他社製CPUにも同様の機能が備わっています)

Intel Microcodeが採用されたのは、Intel P6 Micro-architecture(Pentium ProやPentium II 等)以降。

Intel CPUについて、知っておいてほしいこと

Intel CPU製品にはCPUID (Prosessor Signature)S-SpecPlatform IDが設定されています。

CPUIDが同じでも、型番によってPlatform IDが異なります。

型番が同じでも、出荷時期によってS-Specが異なることがあります。(CPUの機能に差があることも…) さらに、CPUIDも違うことがあります。ご注意ください。

Intel Microcodeについての解説

Microcode
Processorを制御(動作を指示)するためのマシンコード。
格納場所: CPU内部のメモリ
Microcode Update (MCU)
Microcodeを修正するためのコード。各CPUに合わせて作成される。
内容: ヘッダー(そのMCUについての情報) + 暗号化されたデータ
格納場所: BIOS、および一部のOS
マシンのブート時にCPUにロードされる。CPU内のMicrocodeは変更されない。
一般的に、「Microcodeをupdateする」と言う場合は、このMicrocode Update(MCU)のupdateを指している。
通常、MCUはマザーボード・OSベンダーに配布される。そして、BIOSやOS(またはその修正プログラム)に組み込まれた状態でエンドユーザーに提供される。
Microcode Update Revision (MCU Rev)
Microcode Updateのバージョン
数字(16進数)の一番大きいものが最新。
CPUにMicrocode Update (MCU)が適用される仕組み
マシン ブート時: BIOS内のMCUがCPUにロードされる。
OS起動時: BIOSのMCUより新しいrevisionがOS内にあれば、ロードされる。
適用期間: マシンのブートからシャットダウンするまで。
搭載CPUに合ったMCUだけがロードされる。
(詳細: CPUに対応しているIntel Microcode (Update)の条件)
搭載CPUに対応するMCUが複数格納されている場合、一番新しいrevisionが適用される。
Microcode module (Microcode container)
BIOSのBIOS region内にあるMicrocode Update (MCU)用の領域。
(BIOS regionについては、BIOS Chipの内容を参照)

中に複数(まれに1つだけ)のMCUが書き込まれている。

UEFI BIOSファイルの中のMicrocode Module

Microcode moduleの長さは余裕を持たせてある(使っていない部分がある)ため、MCUのupdate(差し替え)によるサイズの増加に対応できる。
Microcode module(+直後の余白)の長さを変更しないようにすれば、MCUの追加や使っていないMCUの削除も可能。
BIOS内のMicrocode moduleの数 (AMI BIOSの場合)
レガシーBIOS: 1
UEFI BIOS: 1、または2(内容は2つとも同じ)
BIOS内のMicrocode Update (MCU)のupdate方法
新しいrevisionのMCUが含まれているBIOSファイルをダウンロードし、BIOSを更新する。
または、自分でBIOSファイル内のMCUを差し替えて(BIOSファイルの改造)、BIOSを更新する。(ただし、通常のBIOS update方法では弾かれることがある)
Microcode Update (MCU)を更新するメリット・デメリット
CPUのエラッタ・脆弱性の修正、パフォーマンス改善
たまに新たなバグが含まれることがある。
Microcode Update (MCU)を追加するメリット
BIOSの対応CPUを増やせる。(マザーボードがそのCPUに対応していない場合は意味がない)

各MCUに関する情報はそのヘッダー部分に書かれています。

Intel Microcode Updateのヘッダー
注意点

Intel Microcodeの場合、各項目のフィールド内は1byte(16進数2桁)ごとのlittle endianで記述されており、並び順が異なります。little endianの場合、先頭が下位、末尾が上位となります。


00 00 00 01 → [MCUヘッダー上] 01 00 00 00
07 31 20 19 (mmddyyyy) → [MCUヘッダー上] 19 20 31 07
00 05 06 E3 → [MCUヘッダー上] E3 06 05 00

※ 16進数 1桁 = 4bit = Half-byte (Nibble)
16進数 2桁 = 8bit = 1byte

Intel Microcode Update ヘッダー
項目とフィールドの長さ (最初の方のみ)
項目名 長さ 説明
Header Version 4 bytes MCUヘッダーのバージョン番号
Update Revision 4 bytes MCUのバージョン番号
Date 4 bytes MCUの作成日
mmddyyyy
Processor Signatue 4 bytes 対応CPUのCPUID
Checksum 4 bytes MCUヘッダーとデータの整合性を検証するために使われる。
Loader Revision 4 bytes MCUをロードするプログラムのバージョン番号
初期値 = 00000001
Processor Flags 4 bytes 対応CPUの(1つ以上の)Platform IDを示すフラグ
このフィールドは4 bytes分確保されているが、下位 8bits(先頭の1byte = 16進数2桁)だけがProcessor Flagsとして使用されている。
Data Size 4 bytes MCUの内、暗号化されているデータ部分のサイズ
Total Size 4 bytes MCU全体のサイズ(ヘッダー + 暗号化されたデータ)
1024の倍数

参照 [PDF]
https://software.intel.com/sites/default/files/managed/a4/60/325384-sdm-vol-3abcd.pdf

9.11.1 Microcode Update
Table 9-7. Microcode Update Field Definitions 部分

BIOS内の「Microcode Update」コード

BIOS chipにはFull(Whole) BIOSが書き込まれています。その中に、Intel Microcodeモジュールが入っています。

Intel Microcodeモジュールの数 (UEFI BIOSの場合)
1つ、あるいは2つ。
2つの場合、内容は2つとも全く同じ。
Intel Microcodeモジュールの内容
ヘッダー、一つあるいは複数のMicrocode Update (MCU)、空白 等。
通常、CPUID・Procceser Flags(Platform Type)ごとにMCU Revisionが1つずつ入っている。最新のreivisionだけが使われるため、複数のrevisionを入れるのは無駄になる。
Intel Microcodeモジュール内のMicrocode Update (MCU)の配置
BIOSベンダー・マザーボードベンダー・マザーボードの機種によって少しずつ異なる。

AMI UEFI BIOSの例

  1. ヘッダー
  2. MCU (1つ目)、MCU (2つ目)、MCU (3つ目) …
  3. 空白(FF埋め、00埋め)

ASUS Z170 PRO GAMINGのBIOS (AMI UEFI BIOS)の場合、最後のMCUと空白の間に何やらコードがあります。別の機種では、空白の後に同様のコードが記述されているものがありました。

ASUS Z170 PRO GAMING Intel Microcode Module、最後のMCUの後ろのコード

BIOSファイルを改造してMCUをupdateする時は、このようなコードを消さないようにしましょう。

重要

モジュールとモジュールの間にはpadding(空白)が入っています。

MCUのサイズに変更があった場合、Intel Microcodeモジュールのサイズが変わらないように、空白部分のサイズを増減して調整します。

Intel Microcodeモジュールのサイズが変わってしまうと、後ろのモジュールの開始位置がずれ、BIOS全体のサイズも変わってしまいます。その場合、BIOSが動作しません。

Intel Microcode Update Guidance (Microcode Revision Guidance)

2018年から公表されてきたIntel CPUの脆弱性の一部(Spectre Variant 3a、Spectre Variant 4、L1TF、MDS)への対策を施したMicrocode Update Revisionが出されています。(OS・ソフトウェア側でも対策が必要です)

Microcode Update Guidance (Microcode Revision Guidance)には、脆弱性対策済みのMCU Revisionが出ているか否かが表示されています。出ていれば、「New Production MCU Rev」列にReivisionが表示されています。

  • [最新] AFFECTED PROCESSORS: Latest Transient Execution Attacks by Product CPU Model (2020/06/09)

    https://software.intel.com/security-software-guidance/processors-affected-transient-execution-attack-mitigation-product-cpu-model

    ※ 脆弱性INTEL-SA-00320の影響を受けるCPUのリスト。「2020.1 MCU Update Version2 (where applicable)」に修正済Revisionが記載されている。

  • Microcode Update Guidance (2019/11/12)

    https://www.intel.com/content/dam/www/public/us/en/documents/corporate-information/SA00270-microcode-update-guidance.pdf

  • MICROCODE REVISION GUIDANCE (2019/05/14)

    https://www.intel.com/content/dam/www/public/us/en/documents/corporate-information/SA00233-microcode-update-guidance_05132019.pdf

  • MICROCODE REVISION GUIDANCE (2018/08/08)

    https://www.intel.com/content/dam/www/public/us/en/documents/sa00115-microcode-update-guidance.pdf

  • MICROCODE REVISION GUIDANCE (2018/04/02)

    https://newsroom.intel.com/wp-content/uploads/sites/11/2018/04/microcode-update-guidance.pdf

  • MICROCODE REVISION GUIDANCE (2018/03/06)

    https://newsroom.intel.com/wp-content/uploads/sites/11/2018/03/microcode-update-guidance.pdf

  • MICROCODE REVISION GUIDANCE (2018/03/01)
    [ページ無し]
  • MICROCODE REVISION GUIDANCE (2018/02/08)
    [ページ無し]
注意点

Microcode Update Guidance (Microcode Revision Guidance)の「Platform ID」列には、Platform IDではなく、Processor Flags (Platform type)が記載されています。

Platform IDとProcessor Flagsには関連はあるものの、数値が異なります。(詳細は次々回の記事に書きます)

最新のMicrocode Update Revisionを知る方法

GitHub - platomav/CPUMicrocodes: Intel, AMD, VIA & Freescale CPU Microcode Repositories
https://github.com/platomav/CPUMicrocodes

最新Revisionは上のURLでチェックしています。Intel, AMD, VIA, FreescaleのMicrocodeが集められています。

(例) Intel Microcodeを探す場合
フォルダーアイコンの右隣の「Intel」のリンクをクリックすると、一覧が表示されます。CPUIDとProcessor Flagsで検索してください。

.binファイルのリンクからダウンロードすることもできますが、ファイル単独では使用できません。BIOSファイルに組み込むためのものです。

バグがあるMicrocode Update Revision情報

CPUID: 50654、Processor Flags: B7 (Platform ID: 0,1,2,4,5,7)、Rev: 0x2000065、Date: 2019-09-05
Warm reboot後にCPUがハングする。
影響を受ける製品: Intel Skylake CPUの一部 (E3 v5 Family以外のXeon。Destop用はX-seriesとExtreme Editionのみ)
参照: https://www.bleepingcomputer.com/news/linux/ubuntu-linux-gets-intel-microcode-update-to-fix-cpu-hangs/
(2019/12/04)

環境のせいかもしれませんが、2019年12月に私のPC(CPU: Intel Core i5-6500、OS: Windows 10 1809 64bit)で発生した問題も書き記しておきます。

CPUID: 506E3、Processor Flags: 36 (Platform ID: 1,2,4,5)、Rev: D6、Date: 2019-10-03

Microcode Edgeで開いたPDFファイル内を検索時、検索対象があるのに見つけることができない(No results、検索結果がありません)か、検索がなかなか終わらない。

Rev D4と比べて、RAMDISKの転送速度等のパフォーマンスが低下。

MCU Revision変更履歴:
D4 → D6(問題発生) → D4 → D6(問題発生) → D4 → DA
影響を受ける可能性のある製品:
Intel Skylake CPUの一部 (Skylake S、Skylake H、Skylake Xeon E3 v5 Family)
関連記事