知恵袋1
知恵袋2
同じような質問を知恵袋でやっていますが(ルール違反承知の上で、こちらで解決したら向こう側も閉じます。)
図の画像など、私が分からない点を回答者さんへ伝えられないので
teratailで質問させていただきます。
尚、知識がまだ前提で躓いているレベルです。
OSの仕組みに興味を持ち、参考書を読んでいます。
その中で・・・
セグメンテーションについて解説されていました。
--
状況としては
データセグメント・コードセグメント・スタックセグメント・テキストセグメント
などのメモリセグメント(?)
セグメント方式・ページング方式という仮想メモリを実現するにあたって、どうやって物理メモリと仮想メモリをどうやって扱うか のやつ
どっちも”セグメント”がついているけど、お互い関係あるの?
で、悩んでいる段階です。
wikiでググると、”セグメンテーション”はないけど”セグメント方式”は出てくる。
だから、・・・セグメンテーション==セグメント方式(???)
--
(そもそも、前提から理解できていないけれど・・・)
この上記の図はメモリセグメントを表しています。
ここで、疑問なのは
メモリセグメントというのは
物理アドレスを コード・データ・スタック などなどの領域にぶった切ってから
プロセスにそれぞれの領域を1つずつ渡していくのですか?
図がプロセスに割り当てられたメモリだけを示しているのか
それとも、
メモリ全体を示しているかでかなり解釈が変わってくると思うのですが・・・
--
もしくは・・・
プロセスがOSから渡された、連続に並んで見える仮想アドレスを
プロセスが勝手にメモリセグメントの領域を決めるんですか?
(うまく伝えずらいですが・・・)
分からないので教えてください。
言い方表現で誤っているところ・何を言っているのかわからかったら
修正依頼お願いします・・・。
0から作るOS開発 Vol.1 ブートローダー編 0から作るブートローダー
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/18 23:21
2019/11/19 11:46
2019/11/19 11:52
2019/11/20 02:12 編集
2019/11/20 02:09
2019/11/20 02:10
2019/11/20 02:19
2019/11/20 04:09
2019/11/20 08:50
2019/11/20 09:22
2019/11/20 09:26
2019/11/20 09:30
2019/11/20 09:42 編集
回答5件
0
ベストアンサー
セグメントというのは「部分」だと思ってください。メモリ全体の中の「部分」のことを、セグメントという分け方で考えています。
これを説明するには、現在の Intel x86 プロセッサの始祖である 8086 プロセッサに(さらにその前身たる 8085 まで)遡らねばなりません。
Intel は 8080 プロセッサとそのマイナーアップデートとも言うべき 8085 プロセッサにより、8bit CPU の分野で2強の位置を築きました(対抗としては 6809, あと Intel 互換の Z-80 など)。そして次世代 CPU として、16bit の 8086 の開発を行います。
8086 は 8bit CPU とは違い、メモリ空間が大幅に増強(64KB → 1MB)されました。が、プログラムを作る側としては、8080/8085 からすんなりと移行してもらいたい。そのため、「8080 のアセンブリソースを再アセンブルするだけで 8086 に対応できるようにする」という手段に出ます。
このためにアドレスは 64KB に限定されることになってしまいました。(あくまでも8080/8085 互換ソースの場合)
64KB のアドレッシングで、1MB のメモリ空間を十全に使うためにどうするか。その回答が「セグメント」の導入です。
セグメントという「1MB の中のどの64KB の部分かを示す」ものを追加することで、必要ならば1MBの空間をフルに使いながらも、コードレベルでは64KBのアドレッシングのみで済ませられるようにしたのです。
これを実現したのが 8086 のセグメントレジスタです。セグメントレジスタはコード用、データ用、スタック用、汎用の4個(CS,DS,SS,ES)用意され、これにより「コードとデータの分離」も可能となりました。
さて、16bit CPU が広まっていくと、大型コンピュータにあった特権方式の保護といった高度な(OSに必須な)機能が CPU で実装されるようになってきます。それが 80286 から始まる「プロテクトモード」です。プロテクトモードでは資源を仮想化する(物理と論理を切り離す)ことによる保護が行われるようになっており、Intel は 80286 においてセグメントの定義を変更することでこの仮想化を実現したのです。
プロテクトモードにおいてはセグメントレジスタはメモリアドレスを直接表すのではなく、メモリ空間の情報を格納しているセグメントディスクリプタという領域へのポインタとなっています。
セグメントディスクリプタが「論理アドレス 0x00400000~の1MB」を表していたとして、それが物理的なメモリアドレスのどこに該当するのかは、メモリ管理ユニット(MMU)以外知っている必要がありません。もしかしたら物理メモリが割り当てられていない場合もありえます。
そのような場所にアクセスが発生したら、MMU が割当たっていないことを検知して、新しくメモリを割り当てます。物理メモリに空きがなければ、使う頻度の低い他のセグメントに割り当たっていたメモリを(HDD にデータを退避させるなどして)解放して割り当て直します。(メモリのスワップといわれるものです)
そして32bit CPU になると、わざわざセグメントでメモリ空間を分けずに、32bit のフラットなメモリ空間を一つのセグメントに割り当てる(=フラットメモリモデル)のが常態化します。ここに至ってセグメントの意味は(コードとデータの分離と保護、及びメモリの仮想化の二つ以外)なくなったといってよいのです。
投稿2019/11/19 05:14
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/19 07:29 編集
2019/11/19 08:29
2019/11/19 08:34
2019/11/19 23:05
2019/11/19 23:21
2019/11/19 23:54
2019/11/20 00:35
2019/11/20 00:48
2019/11/20 01:51 編集
2019/11/20 02:04
2019/11/20 02:56 編集
2019/11/20 03:00
2019/11/20 03:56 編集
2019/11/20 04:05
2019/11/20 04:32
2019/11/20 05:40
2019/11/20 08:48
2019/11/20 09:23
2019/11/21 23:57
2019/11/22 00:54
2019/11/22 01:38
2020/01/14 02:19
2020/01/14 02:22
2020/01/14 02:34
2020/01/14 02:50
2020/01/14 04:02 編集
2020/01/14 04:01
2020/01/14 05:15
0
こんにちは。
その「メモリセグメント」は、MMU(メモリ管理ユニット=仮想メモリを実現するためのハードウェア)と言うにはあまりに稚拙過ぎるハードウェアです。
8086という30年以上前のCPUで16ビットのアドレス・レジスタで無理っと20ビットのメモリ空間をアクセスできるようにするために工夫された仕組みです。
因みにその図は「メモリ全体を示している」がほぼ正解です。
その「メモリセグメント」とMMUのセグメント方式やページング方式をごっちゃにすると理解できる筈がありません。30年以上前の技術である「メモリセグメント」を今は使うことはまずありませんので、特殊なケースを除き忘れて良いと思いますよ。
セグメント方式のMMUは正直複雑怪奇で理解するのは超苦労する上に実際に使われる場面はあまりないので、ページング方式のMMUを理解すると良いと思います。ページング方式は比較的単純なので理解しやすいです。(と言っても結構難易度高いですが。)
投稿2019/11/18 17:24
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/19 00:44 編集
2019/11/19 02:31
2019/11/19 03:28
2019/11/19 09:03
2019/11/19 09:35
2019/11/19 10:21
2019/11/19 10:40 編集
2019/11/19 10:48 編集
2019/11/19 10:51
2019/11/19 11:19
2019/11/19 11:56
2019/11/19 13:15
0
コメント付けようかと思ったけど、、
セグメンテーション==セグメント方式
同じようで違う。コンピュータ、、特にPCの世界だと、インテルの影響が強く、8086で採用されたセグメント(セグメントレジスタ)なのかと思います。
ただ、既に、指摘されているように、セグメントは、コンピュータ専用の言葉ではなく、インテルのセグメントとその他のセグメントの意味が混在していると思います。
googleで、"セグメント"で検索したら、セグメントとは(グロービス経営大学院)が引っ掛かりました。また、google翻訳では、"segment" --> 切片、弓形、環節 とかが訳であります。
どれが正しいと、言うより、これらが混在して使われていると思います。
多分、多くの誤解の元となっている インテルのセグメントについては、Wikipediaにある セグメント方式より、プロテクトモード の方が、より適切かと思います。 元々、インテルの8086のセグメントが特殊で、当時、ライバル(?)だった、MC68000に対し、セグメントの方が優秀だとの論陣を(昔過ぎるので、出典が確認できませんが) を張っています。当時から、無理がある主張でしたが、勝者はインテルでした。(ほかの要因が大きいと思うが)
そんなで、「無理が通れば、道理が引っ込む」結果になったと考えます。
さて、肝心のセグメントですが、引用されている絵では、それぞれのセグメントが独立していますが、インテルのセグメントレジスタによる方法では、オーバーラップします。それで問題を起こさないか、というとそれは、コードを書く人、コンパイラ等が責任を持つ事になります。
また、色々なセグメントがあるのは、インテルのセグメントの名残りと、英語のセグメントの意味から、メモリ空間を区分するための分類ですね。(セグメントに分けた方が管理が楽、、ここで、上記の経営大学院のセグメントが意味を持つ)
さて、こういう視点で見ると、セグメントに分けるという事は、インテルCPUでの定義を離れ、メモリをグループ分けして、管理する手法と考えるのアリとなります。 (多分、これが、インテルのセグメントと混在していると思う)
その一方、メモリ管理の方法として、ページングがありますが、仮想メモリとかと関係しますが、分けて考える事だと思います。(重なる部分は大きいですが)
投稿2019/11/19 13:39
総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/19 20:17
0
どうも英語(カタカナ)が出てくると、専門用語と思ってしまう人が多いですが、英語圏では英単語は単なる意味を持った普通の単語です。セグメントという用語も、メモリ以外の分野でも使われています。
「(全体と対比しての)部分」という意味です。
データセグメント・コードセグメント・スタックセグメント・テキストセグメント
などのメモリセグメント(?)
は、メモリの分類で、
データセグメント・・・・読み書き可能なデータ領域
テキストセグメント・・・読めるが書けないデータ領域
コードセグメント・・・・実行できるコード領域。当然読める。普通は書けない
スタックセグメント・・・読み書きできるので広義のデーセグメントだがスタックとしてのみ使う領域
セグメント方式・ページング方式という仮想メモリを実現するにあたって、どうやって物理メモリと仮想メモリをどうやって扱うか
仮想記憶機構のページング方式は、使われ方と関係なく固定長のページ単位で、メモリとディスクの間を移動します。セグメント方式は、固定長でなくOSが各種目的でプロセスに割り振った塊単位でメモリとディスクの間を移動します。
ということで、とくに意味上の関連は無いです。
仮想記憶のセグメントの単位と、メモリ分類のセグメントが一致しているということもないです。(たまたま一致はあるでしょうが)
投稿2019/11/19 11:50
総合スコア85826
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/19 12:01
2019/11/19 12:12
2019/11/19 12:17
2019/11/19 12:36
2019/11/19 13:06
2019/11/19 23:13 編集
2019/11/20 02:26
2019/11/20 12:08
2019/11/20 13:25
2019/11/20 13:32
2019/11/20 13:46
0
まず、セグメントレジスタのことは忘れましょう。
こういう大規模なCPUになると、CPUとは別に、メモリを管理するMMUというユニットがくっついてます
こいつは何をするかというと、メモリのアクセスを常に監視して、異常なアクセスを検知すると、CPUに対して例外割り込みを発生させ、動作を中断させる役割があります
#と書くと心当たりがあるんじゃないでしょうかw
とあるコードをメモリに展開、実行させるに当たり、OS(のカーネルは)MMUに対し、そのコードの実行ブロック、データブロック(その他コモンブロックやらスタックのブロックやら)にたいし、アクセス可否、書き込み可否、実行可否、のアクセス設定を課して、そのコードの実行におけるメモリアクセスを監視するように設定します。
さて、それに対し、どこかのアホがスタックエリアに実行コードを配置して実行させようとする、あるいはコードエリアを書き換えて別のコードを配置しようとすると、アクセスを監視してるMMUがその実行を強制的に止める、ということになってます
ということで、アクセス制限を課しているメモリブロック(セグメント)で、異常(フォールト)が起こると、例外が出て実行を止め、ウィンドウを表示させて告知しますね。セグメンテーションフォールトと。
投稿2019/11/19 00:50
総合スコア88026
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/19 01:14
2019/11/19 01:58
2019/11/19 05:19 編集
2019/11/19 07:32
2019/11/19 07:33
2019/11/19 08:00
2019/11/19 08:18
2019/11/19 08:28
2019/11/19 08:35
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。