プロセッサの脆弱(ぜいじゃく)性問題を図解するMostly Harmless(1/2 ページ)

正月の“おとそ気分”を吹き飛ばした「プロセッサの脆弱(ぜいじゃく)性問題」。なぜ起こったのか、仕組みを図解することで読み解きます。

» 2018年04月19日 07時00分 公開
[大越章司ITmedia]

この記事は大越章司氏のブログ「Mostly Harmless」より転載、編集しています。


Photo

 2018年、正月の“おとそ気分”を吹き飛ばしたニュースに「プロセッサの脆弱(ぜいじゃく)性問題」がありました。

 その後、Intelが「この脆弱(ぜいじゃく)性はIntelだけのものではなく、他のプロセッサにも存在する」と発表したことが、混乱に拍車を掛けました。これは業界にとって相当に深刻な問題ですが、今回はその話ではなく、プロセッサの脆弱性の「仕組み」について図解してみたいと思います。

プロセッサの基礎知識

 この脆弱性には、「Spectre」と呼ばれる「Variant 1」「Variant 2」の脆弱性と、「Meltdown」と呼ばれる「Variant 3」の脆弱性の3種類があります。

 今回は、このうち説明のしやすいMeltdownについて説明しますが、その前に、脆弱性が起こる仕組みを理解するための、プロセッサについての基礎知識を説明します。

CPUの特権モード

 現代のプロセッサには「特権モード」というのがあり、プロセスに優先度を付けています。OSやデバイスドライバなど、優先的に実行させたいプロセスに与えられるのが最高特権である「カーネルモード」、それよりも優先度が落ちるのが「ユーザーモード」です。

 カーネルモードがプロテクトしているメモリエリアには、通常、ユーザーモードのプロセスはアクセスできませんが、今回の脆弱性はそれを可能にしてしまうというものです。

パイプライン処理

 現代のプロセッサでは、命令の処理を同時並行して行う「パイプライン処理」が主流になっています。

 昔のプロセッサは、命令を1つずつ読み込んで実行し、処理が終わると次の命令にとりかかる、というやり方をしていました。

Photo

 個々の命令は、プロセッサの中でさらに細分化されます。例えば、(1)命令を解読(デコード)する(2)レジスタを参照する(3)足し算をする といった形です。

 そうすると、命令をデコードした後で他の処理に移行した場合、次の命令が来るまでデコードするための回路は遊んでしまうことになります。プロセッサはさまざまな回路の集合体ですが、“ある時点でその一部しか稼働していない”ということです。

 これはもったいない、ということで、それぞれの命令を整理して細分化し、前の命令の処理が終わらないうちに次の命令を始めるようになりました。ハードウェアをなるべく遊ばせない、ということですね。これがパイプライン処理です。最近では数十のステージに細分化されているそうです。

アウトオブオーダー実行

 ところが、ここで問題が出てきます。命令によっては、前の命令で計算した結果を使うことがあります。そうすると、前の命令の実行が終わるまで次の命令を始められません。

 そういった場合に、プログラム上の順序に関係なく、依存関係にない命令を先に実行してしまうことを「アウトオブオーダー」(順序を守らない実行)といい、これがパイプラインを効率よく実行させるために必要な仕組みになっています。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ