[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[b-free: 1295] Re: Memory Protection
隆一です。
# いや、どうも DOS の時代から 86 系のセグメントは嫌いなもので。。。
From: Hideaki Suzuki <h1suzuki@bridgew.edu>
Subject: [b-free: 1270] Re: Memory Protection
Date: Mon, 06 Apr 1998 06:53:54 -0400
...[snip]...
>
> もう一つ。ここで話していたのは、address 空間の code や data への割り振り
> です。
> 多重仮想空間(Multiple Virtual Memory Space って云うんだっけ? ^^)にし
> た場合、実際、各 data や code の始まる address を固定にしても、他の
> process と重なることはありませんから、基本的には問題ありません。むしろ、
> この方が loading の際の relocation などで有利です。しかし、そこには
> segmentation に対する幾つかの不利な点があります。挙げると、
>
> 1.program によって、使う data/code の量が大きく
> 違うのに、どうやって、適当な address 空間の
> 配分を決められるか。>loading 時に決められ無くもないけど。
これは、問題ないんじゃないかなぁ。普通 code 領域が大きくなることはない
ことを考えると、code 領域を data 領域の前に置いておけばいいような気が
します。
code 領域と data 領域が連続していれば無駄もないし。GCC でコンパイルす
ると、自動的にそういう配置になりますね。
> 2.stack/heap などは大きさが変化するが、他の data
> や code などを address 空間で浸食してしまう可能性はないか。
heap 領域については、data 領域が大きくなると考えれば、data 領域そのも
のと考えていいんじゃないかな。
stack については、たしかに他の領域とぶつからないかは問題です。ただ、
普通は、プロセス空間の最初と最後の方に配置してしまって済ませていますね。
スタック領域が 1G を越えるようなことになれば問題が発生が発生するだろう
けど、その前にメモリ不足になってしまうでしょう(今のところは)。
問題といっても、暴走とかいう問題より、スタックオーバーフローのような形
で出てくると思います。
> 3.data を実行しようとした場合に、どう protection を掛けるか。
これは、page の access privilege で指定できます。
実行ファイルのフォーマットで code と data は分けて配置してあるから、
OS が見分けるのは簡単ですし(というか、OS が見分けやすいようにそうして
あるんですが)。
逆に segment を使ってしまうと、たとえば、関数のポインタを使いたいとき
などに困りませんか?
code セグメントとオフセットの両方の値がないと関数のポインタは表現でき
ないわけで、ポインタの形式が問題になってきます。
実際 8086 の場合だと、code 領域の関数のアドレスをデータとして扱うため
に、セグメントとオフセットを組み合わたようなポインタを使っていませんし
たね (Huge モデルの場合)。
> などなどです。
> そう言ったわけで、segmentation を使って方が安全ではあるのですが、実際は
> その cost をどうするかですねぇ。
> あと、386 arch. の話で、もう一つの利点(僕が書いたやつ)は、flat model
> で process を走らせる場合に programmer は 386 の仕様(限界?)のために、
> code も data も stak も heap も、ぜーんぶ、4Gの address 空間に押し込ま
> なければいけません(と言うほど一般人の用途には狭くはないけど)。で、も
> し、seg. 一つに code とかって割り振れば、code/data/stack/heap それぞれ
> が、4Gまで使えます。その辺が、若干の追加の良い点かな。
うーん、資源の問題をいうならば、386 アーキテクチャだとセグメント数に限
界があることを考慮しないといけないのでは?
4G を越えるプログラムはそんなに多くはないと思いますが、セグメントの方
は、プロセス毎に必ず 4 つ必要なわけで、セグメントが足りなくなる方が問
題としては現われやすいと思います。
あとは、まぁ、コンパイラがセグメントを意識するようになっていないので、
C 言語でセグメントを扱うためには、コンパイラ自身の改造が必要になってし
まいますね(GCC が大きなプログラムだということを考えると、これが一番問
題かも)。
p----------------------------------------------------------------------q
| FROM R.Night |
| E-mail: |
| rnaitoh@st.rim.or.jp |
| Key fingerprint = 89 EB 77 95 40 C0 3C CC 37 A1 A7 FA 1C 66 FF D0 |
b----------------------------------------------------------------------d