[Windows] Windows XP SP2 の DEP 機能はもっと昔から作れたはず
研究室のノートマシンに Windows XP Service Pack 2 をインストールしてみました.何やら DEP なるものがインストールされたようです.
DEP とは,データ領域としてマークされたメモリの内容をコードとして実行しないようにする機能です.
AMD64, IA-64 アーキテクチャのプロセッサ,Prescott コアの Pentium 4,Pentium M プロセッサは,メモリのデータがコードかデータかをページ単位で設定することが可能(NX-bit を利用する)で,Windows XP SP2 のハードウェア DEP 機能は,それを利用しています.
ちなみに,今回 SP2 をインストールしたマシンは Celeron プロセッサでしたので,ハードウェア DEP 機能を利用することはできませんでした.
ここで私はふと疑問に思ったわけです.「IA-32 アーキテクチャはデータセグメントのデータを実行することはできないんじゃなかったっけ?」と.なお,ここから先は一般的な話ではありません.
調べたところ,IA-32 インテル(R) アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ および IA-32 インテル(R) アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 下巻:システム・プログラミング・ガイド に,次の事柄が明記されています.
命令フェッチは,コード・セグメントから実行しなければならない.
CS レジスタには,コード・セグメントのセレクタだけをロードすることができる.
命令は,実行可能セグメントに書き込むことはできない.
つまり,IA-32 アーキテクチャではデータセグメントのメモリデータをコードとして実行することはできないようになっていますし,プログラムからコードセグメントのデータを変更することも不可能なのです.
このように,プロセッサの仕様を見ると,セグメント機構によるハードウェア DEP が実現できそうな気がしますが,Windows XP SP2 ではページング機構によるハードウェア DEP のみを利用しています.これから 64 ビットのプロセッサに移行するので,32 ビットの世界を切り捨てて(コードを書くのが面倒?)しまおうということなのでしょうか? あるいは,DEP 機能を 64 ビットプロセッサのメリットとして売り出させて欲しいと,Intel から Microsoft への要望があったのでしょうか?
ところで,IA-32 アーキテクチャではデータセグメントのデータをコードとして実行できないと書きましたが,それなら何故 Windows のアプリケーションではバッファオーバーランが起こるのでしょう.
これに対して私は,Windows が外部プログラムに対して,同じリニアアドレスから開始し,属性(コード/データ)だけが異なる 2 つの異なるセグメントセレクタをそれぞれ CS と DS(=SS) にロードしているからだと考えています.Windows が IA-32 の提供するセグメント機構をフル活用していないのです.現行のアプリケーションで最も利用されているフラットモデル(昔でいうスモールモデル)はそういうメモリモデルなのですが,完全にコードとデータを切り離したメモリモデルを新たに作っていれば,バッファオーバーランは起こらなかったのでしょう.何だか勿体ない話ですね.
トラックバック
トラックバック URI: https://www.pakunet.jp/hoge/trackback/2004090901
トラックバックはありません.