質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.62%

セグメンテーションとは何なのか。セグメントとは?単語の意味から混乱しています。

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 866

kazuyakazuya

score 134

知恵袋1
知恵袋2
同じような質問を知恵袋でやっていますが(ルール違反承知の上で、こちらで解決したら向こう側も閉じます。)

図の画像など、私が分からない点を回答者さんへ伝えられないので
teratailで質問させていただきます。

尚、知識がまだ前提で躓いているレベルです。

OSの仕組みに興味を持ち、参考書を読んでいます。

その中で・・・

セグメンテーションについて解説されていました。

-  

状況としては

データセグメント・コードセグメント・スタックセグメント・テキストセグメント
などのメモリセグメント(?)
セグメント方式・ページング方式という仮想メモリを実現するにあたって、どうやって物理メモリと仮想メモリをどうやって扱うか のやつ
どっちも”セグメント”がついているけど、お互い関係あるの?
で、悩んでいる段階です。

wikiでググると、”セグメンテーション”はないけど”セグメント方式”は出てくる。

だから、・・・セグメンテーション==セグメント方式(???)

-  

イメージ説明

イメージ説明

(そもそも、前提から理解できていないけれど・・・)

この上記の図はメモリセグメントを表しています。

ここで、疑問なのは

メモリセグメントというのは

物理アドレスを コード・データ・スタック などなどの領域にぶった切ってから

プロセスにそれぞれの領域を1つずつ渡していくのですか?

図がプロセスに割り当てられたメモリだけを示しているのか

それとも、

メモリ全体を示しているかでかなり解釈が変わってくると思うのですが・・・

-  

もしくは・・・

プロセスがOSから渡された、連続に並んで見える仮想アドレスを

プロセスが勝手にメモリセグメントの領域を決めるんですか?

(うまく伝えずらいですが・・・)

分からないので教えてください。
言い方表現で誤っているところ・何を言っているのかわからかったら
修正依頼お願いします・・・。
イメージ説明
イメージ説明
イメージ説明
イメージ説明
0から作るOS開発 Vol.1 ブートローダー編 0から作るブートローダー

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kazuyakazuya

    2019/11/20 18:26

    8bitCPU だからintel 8080ですよね?
    https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AB8080%E4%BC%9D%E8%AA%AC-%E3%82%AB%E3%83%A9%E3%83%BC%E7%89%88-%E9%88%B4%E6%9C%A8-%E5%93%B2%E5%93%89-ebook/dp/B071GNK9LK

    物理的なハードウエアとかも用意しないとできない内容じゃないか?
    と思い断念しました。
    (他に本あるかなぁと思ったのですが intel 8080の資料?はほぼないような・・・)

    キャンセル

  • y_waiwai

    2019/11/20 18:30

    いやいや、Arduinoでいいんです
    日本製でも千ナンボ、中華製なら2百ナンボで買えますがな
    資料も揃ってるし、アセンブラでいじりたおしましょうw

    キャンセル

  • dodox86

    2019/11/20 18:42 編集

    ArduinoですとCPUがAVRになって、アーキテクチャから何から変わってきますので、また理解の壁を作るかもしれません。まぁ、質問は閉じたことですし、この辺にしときましょう。。

    キャンセル

回答 5

checkベストアンサー

+5

セグメントというのは「部分」だと思ってください。メモリ全体の中の「部分」のことを、セグメントという分け方で考えています。

これを説明するには、現在の 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 のフラットなメモリ空間を一つのセグメントに割り当てる(=フラットメモリモデル)のが常態化します。ここに至ってセグメントの意味は(コードとデータの分離と保護、及びメモリの仮想化の二つ以外)なくなったといってよいのです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/14 12:47 編集

    すみません。なんでもないです

    キャンセル

  • 2020/01/14 13:01

    確かに80286では物理アドレスになるんですが、プロテクトモードでは仮想記憶1GBまでが利用可能です。
    というのも、マルチタスクの OS で考えた場合、あるタスクにとってのアドレスAと、別のタスクのアドレスAは(同じ物理アドレスですが)別のものである必要があります(共有しているメモリ領域でない限り)。
    これを実現するためにPresentビットを使用したスワップイン/アウトが利用されています。

    ページングはより柔軟かつ効率的なメモリ管理のために 80386 から導入されたものです。

    キャンセル

  • 2020/01/14 14:15

    そのスワップイン・スワップアウトの処理をセグメント方式と組み合わせて
    実装するかどうかはOSによるんですよね?
    (スワップを使うか使わないかはOSの自由)
    だから、もし
    このスワップ処理がないセグメント方式のOSを作成したら
    タスク同士メモリが重ならないように
    セグメントを割り振るような設計になるってことですか?

    キャンセル

+4

こんにちは。

その「メモリセグメント」は、MMU(メモリ管理ユニット=仮想メモリを実現するためのハードウェア)と言うにはあまりに稚拙過ぎるハードウェアです。
8086という30年以上前のCPUで16ビットのアドレス・レジスタで無理っと20ビットのメモリ空間をアクセスできるようにするために工夫された仕組みです。
因みにその図は「メモリ全体を示している」がほぼ正解です。

その「メモリセグメント」とMMUのセグメント方式やページング方式をごっちゃにすると理解できる筈がありません。30年以上前の技術である「メモリセグメント」を今は使うことはまずありませんので、特殊なケースを除き忘れて良いと思いますよ。

セグメント方式のMMUは正直複雑怪奇で理解するのは超苦労する上に実際に使われる場面はあまりないので、ページング方式のMMUを理解すると良いと思います。ページング方式は比較的単純なので理解しやすいです。(と言っても結構難易度高いですが。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/19 20:19

    > 「メモリセグメント」と「セグメンテーション」は違うみたいですが
    > あたかも同じように書かれているのはなぜでしょうか?

    それは著者さんに聞かないと分からないです。
    ただ、8086のセグメント・レジスタの解説としてはあまり適切な印象は受けません。

    あれは単に16bitでは不足したメモリ空間を20bitへ増やすための手段です。本来セグメント・レジスタは4bitで足りるのですが、16bitあるので64KBytes境界付近を触る時に便利だった記憶があります。(大昔に触った時の記憶ですが。)
    しかし、セグメント分割することにメリットはありませんでした。
    意味があるなら現在でもそのような方式が生き残っている筈です。現在はアドレス空間を下手に分割すると不便になるだけなので「分割のないフラットな空間にする」ことが一般的です。

    キャンセル

  • 2019/11/19 20:56

    わかりました。

    2枚目までは”セグメンテーション方式”の解説。
    3枚目のセグメントレジスターから”メモリセグメント方式”の説明(・・・たぶん)
    なので、セグメンテーション方式のやつは見なかったことにします。

    "メモリセグメント方式"では、メモリ全体を複数の種類のセグメントに分割する・・・
    ってことですよね?

    キャンセル

  • 2019/11/19 22:15

    その通りです。

    キャンセル

+1

まず、セグメントレジスタのことは忘れましょう。

こういう大規模なCPUになると、CPUとは別に、メモリを管理するMMUというユニットがくっついてます
こいつは何をするかというと、メモリのアクセスを常に監視して、異常なアクセスを検知すると、CPUに対して例外割り込みを発生させ、動作を中断させる役割があります
#と書くと心当たりがあるんじゃないでしょうかw

とあるコードをメモリに展開、実行させるに当たり、OS(のカーネルは)MMUに対し、そのコードの実行ブロック、データブロック(その他コモンブロックやらスタックのブロックやら)にたいし、アクセス可否、書き込み可否、実行可否、のアクセス設定を課して、そのコードの実行におけるメモリアクセスを監視するように設定します。
さて、それに対し、どこかのアホがスタックエリアに実行コードを配置して実行させようとする、あるいはコードエリアを書き換えて別のコードを配置しようとすると、アクセスを監視してるMMUがその実行を強制的に止める、ということになってます

ということで、アクセス制限を課しているメモリブロック(セグメント)で、異常(フォールト)が起こると、例外が出て実行を止め、ウィンドウを表示させて告知しますね。セグメンテーションフォールトと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/19 17:18

    わかりました。

    Cで使っているスタックに限っては・・・とりあえず領域
    ”メモリセグメント”とは区別します・・・。

    キャンセル

  • 2019/11/19 17:28

    まあ、スタックにこだわってるようですが、、
    PCのメモリってのは、別に区別はないです。
    4Gのメモリを搭載すれば、4Gのエリアは別に区別のないフラットなすべて読み書き可能なメモリ空間です
    回答に書いてあるとおり、OSはそこにコードにデータにスタックに、、と配置して、よーいどんで実行させる、というだけの話で、OSがそこはスタックだ!といえばそこはスタック領域(スタックセグメント)になるのです。

    キャンセル

  • 2019/11/19 17:35

    ありがとうございます。
    スタック領域に対する疑問は晴れました・・・

    キャンセル

+1

どうも英語(カタカナ)が出てくると、専門用語と思ってしまう人が多いですが、英語圏では英単語は単なる意味を持った普通の単語です。セグメントという用語も、メモリ以外の分野でも使われています。
「(全体と対比しての)部分」という意味です。

データセグメント・コードセグメント・スタックセグメント・テキストセグメント
などのメモリセグメント(?)

は、メモリの分類で、
データセグメント・・・・読み書き可能なデータ領域
テキストセグメント・・・読めるが書けないデータ領域
コードセグメント・・・・実行できるコード領域。当然読める。普通は書けない
スタックセグメント・・・読み書きできるので広義のデーセグメントだがスタックとしてのみ使う領域

セグメント方式・ページング方式という仮想メモリを実現するにあたって、どうやって物理メモリと仮想メモリをどうやって扱うか 

仮想記憶機構のページング方式は、使われ方と関係なく固定長のページ単位で、メモリとディスクの間を移動します。セグメント方式は、固定長でなくOSが各種目的でプロセスに割り振った塊単位でメモリとディスクの間を移動します。

ということで、とくに意味上の関連は無いです。
仮想記憶のセグメントの単位と、メモリ分類のセグメントが一致しているということもないです。(たまたま一致はあるでしょうが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/20 22:25

    少なくとも、8086では”メモリセグメント方式”で使う各セグメントを
    セグメントレジスターで設定・・・

    アプリケーションプログラマーはセグメントレジスターを使って
    セグメントの大きさを変えることができたそうですが
    本来、56KBにして8080とかとの
    互換性を保ちつつ、1MBのメモリ領域を有効利用するために
    1つのセグメントにつき固定長の56KBを与えていると思うのですが

    メモリ確保のためとはいえ、56KB長のセグメントにしなかったら
    互換性はなくなり、メモリセグメント方式をわざわざ使っている
    理由もなくなってしまうのではないかと
    思ってしまうのですが・・・。

    キャンセル

  • 2019/11/20 22:32

    > メモリ確保のためとはいえ、56KB長のセグメントにしなかったら~~~~~
    以下の、ロジックがよくわかりません。
    また、8086のセグメントの概念は、メモリセグメント方式とは直接関係ないです。

    あと、56KBじゃなくて64KBです。

    キャンセル

  • 2019/11/20 22:46

    わかりました。調べなおします・・・。

    キャンセル

+1

コメント付けようかと思ったけど、、

セグメンテーション==セグメント方式

同じようで違う。コンピュータ、、特にPCの世界だと、インテルの影響が強く、8086で採用されたセグメント(セグメントレジスタ)なのかと思います。

ただ、既に、指摘されているように、セグメントは、コンピュータ専用の言葉ではなく、インテルのセグメントとその他のセグメントの意味が混在していると思います。
googleで、"セグメント"で検索したら、セグメントとは(グロービス経営大学院)が引っ掛かりました。また、google翻訳では、"segment" --> 切片、弓形、環節 とかが訳であります。
どれが正しいと、言うより、これらが混在して使われていると思います。

多分、多くの誤解の元となっている インテルのセグメントについては、Wikipediaにある セグメント方式より、プロテクトモード の方が、より適切かと思います。 元々、インテルの8086のセグメントが特殊で、当時、ライバル(?)だった、MC68000に対し、セグメントの方が優秀だとの論陣を(昔過ぎるので、出典が確認できませんが) を張っています。当時から、無理がある主張でしたが、勝者はインテルでした。(ほかの要因が大きいと思うが)
そんなで、「無理が通れば、道理が引っ込む」結果になったと考えます。

さて、肝心のセグメントですが、引用されている絵では、それぞれのセグメントが独立していますが、インテルのセグメントレジスタによる方法では、オーバーラップします。それで問題を起こさないか、というとそれは、コードを書く人、コンパイラ等が責任を持つ事になります。
また、色々なセグメントがあるのは、インテルのセグメントの名残りと、英語のセグメントの意味から、メモリ空間を区分するための分類ですね。(セグメントに分けた方が管理が楽、、ここで、上記の経営大学院のセグメントが意味を持つ)

さて、こういう視点で見ると、セグメントに分けるという事は、インテルCPUでの定義を離れ、メモリをグループ分けして、管理する手法と考えるのアリとなります。 (多分、これが、インテルのセグメントと混在していると思う)

その一方、メモリ管理の方法として、ページングがありますが、仮想メモリとかと関係しますが、分けて考える事だと思います。(重なる部分は大きいですが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/20 05:17

    回答ありがとうございます。

    CPUのアーキテクチャによって”セグメント”というのが
    何を指しているのかが変わるのが厄介です・・・。
    (当初、そのことに気づけなかった)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • OSに関する質問
  • セグメンテーションとは何なのか。セグメントとは?単語の意味から混乱しています。