セグメントの情報について記述されているのが
セグメントディスクリプタ、CPUはセグメント単位で
情報の読み書きや実行を行う。
セグメントディスクリプタ及び
セグメントディスクリプタテーブルはOSが作る。
この理解で合っていますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
セグメントとは何で存在しているのか、をまず理解しないと多分こんがらがりますね……
そもそも 8bit CPU であった 8080/8085 から、16bit CPU である 8086 を作る際に、8080/8085 を使ってきた人や資産が移行しやすいようにと、
「折角増えたメモリ領域(64KBから1MBに)を、今までと似た感覚で使えるように64KB単位で分割して管理しよう」ってので考案されたのがセグメントです。セグメントによって 00000~FFFFF までの 1MB を、
0000~FFFF のセグメントと、0000~FFFF のアドレス値で扱えるようにしようというもの。
8000 セグメントレジスタの値 + 1234 アドレス値 ------- 81234 実アドレス
この方式の弊害として、同時に64KB以上のデータを扱うのには苦労することになるのですが(セグメント境界をまたぐと面倒なことになる)、8086 の導入当初はそれほど気にはなりませんでした。
さて、16bit CPU がこなれてくると、今度はよりモダンな、「特権レベルの制御も含めた保護機能の強力な CPU」が必要となり、80286 が出てきます。
ここでメモリが「仮想化」されます。それまでの8086は、アドレス=物理アドレスでしたが、80286からのプロテクトモードでは、アドレスは論理アドレスであって、物理アドレスではなくなります。利用できるメモリの総量も16MBまで(仮想的には1GBまで)まずは強化されました。
そこで、セグメントの「意味」が変化します。セグメントが直接物理アドレス(の上位部分)を指定していたリアルモードとは異なり、セグメントはセグメントディスクリプタテーブル上のインデックスを指すようになります。そしてセグメントディスクリプタによって、論理アドレスと物理アドレスの結びつきが表現されるようになるのです。
(ただし80286では1セグメントのサイズは64KBのままでした)
そして32bit CPU である 80386 になり、セグメントサイズが物理アドレス限界と同じ 4GB まで拡張され、事実上複数のセグメントを切り替える必要の無いフラットメモリモデルになります。
メモリ管理はOSのカーネル部分(一番コアの部分)のお仕事ですので、セグメントディスクリプタを制御しているのがOSというのもあながち間違いではありません。
投稿2018/02/20 14:46
総合スコア13703
0
こんにちは。
セグメントの情報について記述されているのがセグメントディスクリプタ、
その通りです。
CPUはセグメント単位で情報の読み書きや実行を行う。
各セグメントには論理アドレスとそれに対応する物理メモリが割り当てられます。
ただし、まだ一度もメモリ・アクセスされていないセグメントにはメモリが割り当てられていません。CPUがメモリ未割り当てのセグメントにアクセスするとページ・フォルト例外(割り込み)が発生し、そのハンドラーで当該セグメントにメモリを割り当てます。
セグメントには実行やリードオンリ等のフラグがあり、対応するアクセスのみが許可されます。許可されていないアクセス(例えばリードオンリ・セグメントに書き込みなど)をすると不正メモリ・アクセス例外(割り込み)が発生します。
セグメントディスクリプタ及び
セグメントディスクリプタテーブルはOSが作る。
概ねそれでOKと思います。
他にはブートローダが設定する場合もある筈です。
投稿2018/02/20 14:42
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。