[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[b-free: 1168] Re: Memory Protection
林です。
In message <199803290730.QAA18821@a2.mbn.or.jp>
"[b-free: 1165] Re: Memory Protection"
"makotan@a2.mbn.or.jp" wrote:
makotan> えーっと、Segmentation は Paging より Memory Protection によい。ってはな
makotan> しなんですけど...どうでもいいと思います。
何というかAkiちゃんのいうsegmentationの用法がいまいち分からないですが
実装ベースでx86アーキテクチャのセグメントを使うのは絶対やめた方が良い
です。理由は特にメリットがない上に他のアーキテクチャへの移植に難が出る
からです。
makotan> 多重アドレス空間というのはプロセスごとに全く異なるアドレス空間が割り当て
makotan> られるものです。Win32や32ビット系のUNIXで使われているものです。
これは正しいです。実現としては仮想アドレス->実アドレスの変換はアドレス
変換テーブルで行うのでプロセス毎に変換表を用意してプロセス切替時に入れ
替えるようにすれば実現されます。これ自体は、効率を重視しなければハード
ウェアの支援は要りません。実際にはプロセス切替毎に変換表のキャッシュで
あるTLB(Transfer Look-a-side Buffer)をパージすると効率が悪いので何らか
の支援機構が盛り込まれることもあります。TRONチップLevel2のプロセスIDは
そのための機能です。(タスクIDだったかも)
# TRONチップを含めCISC系CPUでは変換表の形式がCPUで規定されています。TLB
# がヒットしない場合はCPUは予め設定された変換表を見てアドレス変換します。
# RISC系ではCPUではTLB(相当のレジスタ)しか規定されていないものもあります。
# この場合、変換表はOSが(形式も含めて)管理し、TLBのミスヒット時は例外処理
# でOSがTLBエントリの入れ替えをします。
なおB-Freeでも多重仮想空間は使用されています。メモリマネージャの仕様を
見れば分かるようにアプリケーションのコード領域が固定アドレスに割り付け
られているでしょう。多重仮想空間を使わなければ、プロセス間でアドレスが
衝突してしまいます。
makotan> セグメント方式はWin16で使われているものです。
makotan> 一つのアドレス空間を複数プロセスで共有するものです。
こちらは誤解があります。もともとsegmentationはセグメント/オフセットに
よる二次元のアドレス空間を提供する機能です。8086でおかしなセグメントの
概念が作られて以来誤解されているようですけど。
実際のところはsegmentationはページングや多重仮想空間より概念的には上位
にあるもので、x86プロテクトモード(286以降)のようにハードウェアで実装の
なされているものもありますけど、リニアアドレスのページングサポートだけ
あれば十分に実装できます。現実問題としてx86のセグメンテーションは重い
ので使わない方が良いでしょう。
UNIXでもセグメントの概念は使われています。コードセグメント、データセグ
メント、スタックセグメントという分類でですけど。それでコードセグメント
はプロセス間で共有できるように書き込み禁止とかするわけです。最終的には
セグメントをリニアアドレスに割り付けるわけですけど。
余談ですが286プロテクトモードのセグメントはアーキテクチャとしては悪く
ないです。もちろんセグメントの最大サイズが64KBというのは、今となっては
小さすぎますが、それは適用分野の問題でしょう。実際、一部の応用では既に
4GBのアドレス空間でも足りないとか。データベースは96bitアドレスを使って
いますし、それも仕方のないことなのでしょう。
--
Takanori Hayashi
takanori@ohsaki.meidensha.co.jp