hoge diary - September 9, 2004

[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 の提供するセグメント機構をフル活用していないのです.現行のアプリケーションで最も利用されているフラットモデル(昔でいうスモールモデル)はそういうメモリモデルなのですが,完全にコードとデータを切り離したメモリモデルを新たに作っていれば,バッファオーバーランは起こらなかったのでしょう.何だか勿体ない話ですね.

コメント

名前(何でも可):

テキスト(http:// を含む内容は投稿できません):

トラックバック

トラックバック URI: https://www.pakunet.jp/hoge/trackback/2004090901

トラックバックはありません.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Thu Nov 01 01:16:19 JST 2007