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

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

新規登録して質問してみよう
ただいま回答率
85.50%
アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Q&A

解決済

2回答

1787閲覧

セグメントの区別がつかないです。

strike1217

総合スコア651

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

0グッド

0クリップ

投稿2016/09/25 08:42

実験をしてみました。Linuxです。
ちょっと汚いのですが、プロセスの仮想メモリ空間のレイアウトです。

+------------------------------+ 0x0000000000000000
: :
+------------------------------+
| |
| text | 機械命令
| |
+------------------------------+
| |
| data | 初期化された static 変数
| |
+------------------------------+
| |
| BSS | 初期化されていない static 変数
| |
+------------------------------+
| |
| heap | malloc() で動的に確保される領域(上位アドレスに伸びる)
| |

.......

GDB で info registers とやると、以下のように出てきます。

cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x63 99
gs 0x0 0

セグメントレジスタが多少は使われているようですが、
メモリ変換の”セグメント分割”と上の仮想メモリ空間レイアウトのセグメントは何が違うのですか??

リンカはセクション単位で行うはずです。
「ローダが使う情報である」と書いてありましたが、よくわかりません。「アドレス空間の分割」とは関係ないのですか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

仮想メモリ空間のセグメントとメモリ管理のセグメントは全くの別物です。
Linuxのセグメントは仮想メモリの範囲をわかりやすく名前を付けているだけです。
Intel CPUのセグメントは、当然Intel CPUでしか使えませんので、多くのCPUをサポートするLinuxが使える機能ではありませんので、全く使っていません。

投稿2016/10/03 18:03

katsumiy

総合スコア479

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/10/09 05:31

ありがとうございます。 助かりました。
guest

0

こんにちは。

「プロセスの仮想メモリ空間のレイアウト」はどのようにして出力させたのでしょうか?
ヒープがあるのにスタックがないのはちょっと不思議な気がします。
また、data, BSS領域のアドレスまで表示されるのでしょうか? ヒープ領域サイズをリンカは把握できないのでOSに要求して取得したのだと思いますが、OSはdata, BSS領域のアドレスまで把握する必要がないのでちょっと不思議です。

メモリ変換の”セグメント分割”と上の仮想メモリ空間レイアウトのセグメントは何が違うのですか??

「メモリ変換のセグメント」は何を指してますか? 「メモリ空間レイアウトのセグメント」と同じことを指しているように見えてしまいます。

また、提示されている情報に何か矛盾を感じられているのだろうと思いますが、特に矛盾はないと思います。
textはコードセグメントですので、CSが担当します。
Data, BSS, ヒープはデータ・セグメントですね。DataとBSSは固定長なのでData, BSS, ヒープをアドレスが連続する同じ空間に割り当ててもなんら問題ないのでFSを使っているのかも知れません。(MMUがない時代はそのようにしてました。MMUがあってもここを変える必要は特にないので変えてないだろうと思います。分割するとメモリを無駄にするだけですし。)
SSはスタクック用ですね。

リンカはセクション単位で行うはずです。

「ローダが使う情報である」と書いてありましたが、よくわかりません。「アドレス空間の分割」とは関係ないのですか?

「ローダが使う情報」とは何を指してますか? 「アドレス空間の分割」はなにを指してますか?
どちらも質問の中で突然でてきているように見えます。

投稿2016/09/25 17:37

編集2016/09/25 17:57
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/26 02:55

仮想メモリ空間のレイアウトは省略しております。 全部書くと大変なので・・・ 自分の質問を簡単に言うと「メモリ管理のセグメント方式」と「仮想メモリ空間のセグメント」は何が違うのでしょうか?ということです。 Linuxはセグメント方式ではなく、ページング方式のはずです。 なぜ、仮想メモリ空間がセグメントで分割されているのでしょうか? 自分の持っている本に「仮想メモリ空間のセグメントはロードする作業時に利用される」ということが書いてありましたので・・・
Chironian

2016/09/26 04:48

> 仮想メモリ空間のレイアウトは省略しております。 その元データはなんでしょうか? 回答で指摘したようにコンピュータ出力を省略したもののように見えないので混乱してます。 > Linuxはセグメント方式ではなく、ページング方式のはずです。 > なぜ、仮想メモリ空間がセグメントで分割されているのでしょうか? 「仮想メモリ空間がセグメントで分割されている」ってどこ情報でしょうか? 質問の中に「セグメントで分割」さているような記載はないですよ。単に分割されているだけです。 ページング方式でも割り当てるメモリ空間を分割して割り当てることが一般的です。 連続した論理アドレス1塊としてメモリを割り当てなければいけないという制限はないです。 セグメント・レジスタに値が入っていますが、各セグメントをページング方式で設定しているのではないかと予想してます。 > 自分の持っている本に「仮想メモリ空間のセグメントはロードする作業時に利用される」ということが書いてありましたので・・・ 仮想メモリ回りの用語は混乱が激しいですから、文脈が分からないと意味も分からないのです。 strike1217さんが苦労されているようにこの分野は用語の混乱が激しいです。 ですから、strike1217さんが質問する際にも、用語が複数の意味に解釈できるため、質問の意図が伝わりにくいです。厳密に表現する、言葉の意味を説明する等の工夫が必要なのです。 ところで、ちょっと検索してみたら、面白いページがいくつかありました。少し内容は難しいですが、この辺の技術も少し解説されてます。 http://www.nminoru.jp/~nminoru/programming/arch/virtual_memory.html http://www.journal.ieice.org/conts/kaishi_wadainokiji/199910/h111007.html http://keisanki.at.webry.info/201002/article_3.html
strike1217

2016/09/26 05:40

こ、困りました。 Intelのマニュアルを見てみたのですが、自分が知りたいことが書いていないようです。 仮想メモリのレイアウトネットのサイトからわかりやすいものを持ってきただけです。 アドレスはC言語でちゃんと確認済みです。 ページング法式でメモリ管理を行うのに、「仮想メモリ空間内にデータセグメントやコードセグメント、その他のセグメントが存在している」理由がわからないのです。 ページグン方式でメモリ管理を行うのに「なぜ仮想メモリ空間の中にセグメントが存在している」のでしょうか? すなわち、「セグメント方式でメモリ管理を行っている」のではないでしょうか?
Chironian

2016/09/26 05:53

インテルCPUのMMUのページング方式を把握していないので予想ですが、セグメント方式を利用してページング方式を実現している場合はあり得るように思います。 詳しくはインテルCPUを使って実装するページング方式の具体的な部分を調べるしかないです。 ↓にそれっぽいページがありました。これとインテルの仕様書を照らし合わせれば分かるかも? http://www.tldp.org/LDP/khg/HyperNews/get/memory/80386mm.html
strike1217

2016/09/26 06:04

ふむふむ・・・ そうですか。 仮想メモリ空間のセグメントとメモリ管理のセグメントは全くの別物である可能性もあるので、もう少し調べてみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問