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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Q&A

3回答

5024閲覧

仮想アドレスの領域の表示について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

0グッド

0クリップ

投稿2015/09/22 13:37

http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html
ここにテキストの領域というのがありますが、ここのアドレスを表示したいです。
cで表示するにはどうすればよいでしょうか?

あと、領域がいくつもあると思いますが、どういう風に使い分けていて、どんな時にどの領域が使われるのでしょうか?

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

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

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

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

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

guest

回答3

0

C言語は、ある意味何でもできるので、やろうと思えばできなくはないです。(詳しく確かめた訳ではないので、処理系によっては禁止されているかもしれませんけれども。)

が、しかし、テキスト領域 はプログラムが格納される領域なので、不用意にアクセスしてデータ(=プログラム)を壊すと暴走しサーバーの再起動を余儀なくされてしまうので、通常は行いませんし、行う必要もありません。
(テキスト領域にアクセスする必要があるのは、おそらく、組み込み系の一部のプログラムか、コンピューターウィルスくらいだと思います。)

アクセスの必要性とリスクを理解している方ならば、アクセス方法も当然ご存知のはず(特別な方法は不要)なので、敢えて説明はしません。

領域がいくつもあると思いますが、どういう風に使い分けていて、どんな時にどの領域が使われるのでしょうか?

という点についてですが、その役割についても sumsum25さんがご参照のページに既に説明されています。

  1. テキスト領域:機械語に翻訳されたプログラムが格納される. この機械語の命令が 1 行づつ実行されることでプログラムが動く。
  2. 静的領域:グローバル変数などの静的変数が置かれる。
  3. ヒープ領域:メモリの動的管理 (C 言語の malloc 関数や C++ の new 演算子でメモリを確保すること) で用いられる。
  4. スタック領域:今回の演習で扱ったように CPU のレジスタを一時的に退避させたり、また C 言語の自動変数 (多くのローカル変数) が置かれる。

1)テキスト領域 はプログラムが格納される場所なので、プログラムがコンパイル/リンクされた時点で自動的に確保されるもので、プログラマーが利用できる領域ではありません。

2)静的領域 は「静的変数」つまりコンパイル時点で変数の型や数が確定し、プログラムの実行中ずっと変更のない(=静的)なものが割り当てられる領域で、コンパイル/リンクの時点で処理系によって割り当てられるので、プログラマーが利用できる領域ではありません。

3)ヒープ領域 は、プログラム実行中に必要に応じて割り当てられる(プログラマが確保する)領域です。具体的には「C 言語の malloc 関数」や「 C++ の new 演算子」で割り当てられるので、使用後にはプログラマーの責任で「解放」してやらないといけない領域です。

4)スタック領域 は、関数の呼び出しローカル変数の使用によって、処理系(コンパイラー/リンカー)が自動的に割り当てる領域なので、プログラマーが直接利用できる領域ではありません。

もし詳しくお知りになりたいのであれば、プログラマーが書いたソースプログラムをコンパイラーやリンカーといったツールによってどのように実行形式のファイルに変換し、それがコンピューターのメモリー上にどのようにロードされて実行されるのかについて、大まかでも良いので調べてみられると良いです。

投稿2015/09/22 14:34

pi-chan

総合スコア5936

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

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

0

中途半端に、
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html
だけを問題にしているようですが、???

マイクロプロセッサおよび演習 (最終稿)
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/
から、順に読んで、行ってみて理解出来なければ、
学校の演習程度でも、能力不測と云う事で、諦めも付くかもでしょうが、
前提となっているのが、
2001~2004年の講義のまとめです。
前提が古すぎなような気がします。

【抜粋】
「本ページでは私 (金丸) が 2001 ~ 2004 年度に東京農工大学にて行った
「マイクロプロセッサおよび演習」の演習分に関する資料を公開しています。」
【抜粋了】
の様子ですから、場合により読み替えたり、
質問者さんが使用している環境に合わせて、再構築したり、改変したりする能力も
要求されます。

投稿2015/09/22 18:15

編集2015/09/22 18:21
daive

総合スコア2028

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

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

0

領域がどこからどこまでかというのは環境に依存するのでC言語だけでは無理ですが、だいたいどの辺かなら表示できます。その領域にある値ごとにアドレスを表示してみればいいのです。

#include <stdio.h> #include <stdlib.h> static const int rodata = 0x12345678; static int data = 0x12345678; static const int bss; void text() { } int main(void) { int stack; int *heap; heap = malloc(sizeof(*heap)); printf("text: %p\n", text); printf("rodata: %p\n", &rodata); printf("data: %p\n", &data); printf("bss: %p\n", &bss); printf("stack: %p\n", &stack); printf("heap: %p\n", heap); free(heap); return 0; } /* Linux(64bit)上での出力例 text: 0x400596 rodata: 0x4006d4 data: 0x600ab0 bss: 0x600ab8 stack: 0x7ffd12470274 heap: 0x1fa9010 */

ここでrodata, data, bssはいずれも静的領域に入ります。textとrodataは組み込みでRAMに展開せずにROMから直接読みや実行ができる場合があるのでだいたい並んでます。dataとbssも似てるので並んでますね。そしてstackがずいぶん高いとこにありますね。

アドレスを見ると、ちゃんと「テキスト領域<静的領域<ヒープ領域<スタック領域」 になってますね。ただし結果は環境に依存しますので、質問者さんの環境ではどうなっているか試してみてください。

投稿2015/09/22 15:57

sharow

総合スコア1149

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問