OSのメモリ保護/管理機構

タネンバウムの「モダーンなオペレーティングシステム」(なんだその訳は(^^;))なんてのを片手にOSの勉強をしていた昔は、勝手に正しいOSの実装はこんな感じだと思っていました。

  • ファイルシステムからローダ/リンカでメモリに読み込まれる際には、text領域とdata領域は別のメモリブロックを割り当てる
  • text領域はExecutable |Readable
  • text領域はプロセス間で共有(リエントラント)
  • data領域はReadable | Writable
  • stack領域はReadable | Writable
  • heap領域はReadable | Writable
  • heap領域はライブラリがmalloc等のトリガでOSからメモリブロックを確保する
  • heap領域はライブラリがfree等のトリガでOSに返却する
  • 領域外をアクセスしたらその場で落ちる

……と、思っていたんですよ。
まぁ、実際IBMAIXとか使ってると、何かといえば「Segmentation Fault」が発生していたので、メモリ保護はそこそこきちんと動いているんだろうなぁ、と余り考えずに見ていたのですが、昔のWindowsなどでは、

  • text領域はExecutable |Readable |Writable
  • text領域はプロセスごとに別に確保(ファイル名から一意性を保証できないので)
  • data領域はReadable |Writable |Executable
  • stack領域はReadable | Writable |Executable
  • heap領域はReadable |Writable |Executable
  • heap領域はfree等のトリガでもOSに返却しない
  • 領域外をアクセスしたらその場で落ちる(こともある)

という作りに割合なっているらしきことを知ってたいそうショックを受けたのを覚えています。自己書き換えまんせーって感じで。
PC用ソフトを作っていたとき、一緒にコーディングしていたプログラマーに「自己書き換えでもっと速くなりますよ!」と嬉々として言われて「いいから落ち着け」と思いとどまらせたのもいい思い出です(^^;)。


てなことを、Linux上でのheap実行権限の話をしているところを読んでふと思いだしてみたのでした。今時のNT Kernelがどうなっているかは判らないのですが。
……え? x86ってページに実行権限フラグを持ってないの? ほんとに(^^;)?