メモリアドレスの素朴な疑問

このQ&Aのポイント
  • メモリに関する疑問について調べましたが、見つけることができませんでした。メモリには1バイトごとにアドレスが割り振られていますが、いつ割り振られるのか、どこに置かれるのかについて教えてください。
  • メモリアドレスの割り振りについて知りたいです。メモリには1バイトごとにアドレスが割り振られていることは理解していますが、具体的にはいつ割り振られるのか、どこに置かれるのか教えてください。
  • メモリアドレスについて詳しく教えてください。メモリには1バイトごとにアドレスが割り振られているそうですが、いつ割り振られるのか、どこに置かれるのか、調べることができませんでした。お力をお貸しください。
回答を見る
  • ベストアンサー

メモリアドレスの素朴な疑問

メモリアドレスについて メモリに関する素朴な疑問があります。 当然この程度の事はネットや書籍で調べられると思い 探したのですが、見つける事ができませんでした(汗)。 勘違いをしている部分もあると思いますか゛、どうかお助け下さい。 メモリには1バイトごとにアドレスが割り振られている事は理解できます。 ところでアドレスはいつの時点でどこに割り振られるのでしょうか? (1)メモリの製造時にバイト単位にROM化されて割り振られる。 (2)パソコン起動時にバイト単位にハードディスクから読み込まれて割り振られる。 (3)それ以外。 またバイトの先頭、後尾いずれに置かれるのでしょうか? 当方、独学、経験無しの55歳、基本情報処理試験午前試験クリアレベルですので、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

対象にもよりますが, 今どきなら「物理アドレス」と「論理アドレス」は区別すべきでしょう. システム全体で一意なのが「物理アドレス」, プログラムごとに決まるのが「論理アドレス」です. 物理アドレスは, 起動時にメモリコントローラが決めます. 一方論理アドレスはプログラムが実行されるごとに OS が割り当てます. もちろん最終的には物理アドレスでアクセスするのですが, この論理アドレスから物理アドレスへの変換は CPU が行います (もちろん変換するために必要な表は OS が容易しています). 変換機構としては「セグメンテーション」や「ページング」というものがあります. 今は両方使うのが多いかな?

arinko2
質問者

お礼

お礼が大変遅れてすみません。 今まで悩んでいたのですが、やっと理解できました。 要するに私が今時の人間では無かったのです。(笑) 思い起こせば今から35年前のシャープのMZ2000というパソコン のイメージが払拭できず勘違いをしていたのです。 質問から半年間かかって納得できました。 本当にありがとうございました。

その他の回答 (4)

noname#194317
noname#194317
回答No.5

ものすごくベタな表現をすると、そのように配線されているからです。 メモリはCPUが持つアドレス空間の中に置かれるわけですが、アドレス空間の大きさは、アドレスバスの幅(本数)で決まります。メモリをアドレスバスに配線接続する際に、どのアドレス線につなぐかで何番地になるかが決まります。 MMUなどのメモリコントローラがあるシステムだと、メモリ空間の中でメモリの番地割り当てを変えられるので、メモリ番地は永久不変じゃないんですが、基本的には配線で決まると思っていれば外しはしません。

arinko2
質問者

お礼

お礼が大変遅れました。 つい最近やっと納得できました。 本当にありがとうございました!

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.4

アドレスはパソコンの規格で決められています。 CPUが最初に読み込むアドレスが決まっていて、メモリの割り当て開始アドレスも決めれています。 そう言った仕様が決まっているので、OSやプログラムが動作できるのです。 http://www.yt3.info/cpu/cpu_and_main_memory.html http://www.kogures.com/hitoshi/webtext/hs-cpu-address/index.html http://www.page.sannet.ne.jp/je3nqy/mcom/mcom2.htm http://www.math.kobe-u.ac.jp/~taka/asir-book-html/main/node19.html http://www.geocities.jp/hpt_user99/address.html http://itpro.nikkeibp.co.jp/article/COLUMN/20070404/267385/

arinko2
質問者

お礼

お礼が大変遅れました。 つい最近やっと納得できました。 本当にありがとうございました! URL参考になりました!

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

簡単のために4096BYTEのメモリーを考えましょう。横64本、縦46本の線を1本ずつ選ぶと、どの1BYTEも選べます。 64本と言うのは2進で6本の線でゲートを組めば出来ますね。 つまりアドレス線は12本です。 4096BYTE(これを便宜上4kBYTEと称する)ごとに頭に0KB、4KB,8KBをつければ巨大なメモリーが構築できますね。

arinko2
質問者

お礼

お礼が大変遅れました。 つい最近やっと納得できました。 本当にありがとうございました! わかりやすい説明助かりました!

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.1

アドレスバスという言葉を聞いた事ありますか? 答え:メモリのアドレスはハード的に決まっている

arinko2
質問者

お礼

早い回答だったのにお礼が大変遅れてすみませんでした。 つい最近やっと納得できました。 本当にありがとうございました!

関連するQ&A

  • 素朴な疑問

    こんばんは。よろしくお願いします。 素朴な疑問なのですが、 1.my documentってハードディスクの何割までしか保存できないとかいう、 のはあるのでしょうか?(ごみ箱は指定できますよね?) ハードディスクに空きがあれば、いくらでも入るのでしょうか? 2.デスクトップに保存って、ハードディスクのどこに保存されているのでしょうか?(Explorerを見ても一番先頭にありさっぱり分かりません。) 3.デスクトップに保存する事によっての、弊害ってありますか? 例えば、立ち上がりが遅くなるとか・・・ 4.ドリームウェイバーとファイヤーワークス同時使用していると、メモリが足りなくなります。(まれに)(メモリは128です) 複数のアプリケーションを使用しているときに、ただ、アプリを終了しただけだと、メモリが開放できず、パソコン自体を終了することによって、メモリが開放できるようです。 で、質問なのですが、アプリを起動しているままで、メモリを開放することは出来ないでしょうか? つまり、PCを再起動しなくても大丈夫なようにしたいのです。 きっと、ものすごいアホな質問なのですが、パソコンの内部のことは、 全く分かっていません。出来るだけ分かりやすく教えていただけないでしょうか? よろしくお願いします。 WINDOWS98です。

  • OSはどのようにして、CPUにメモリ上の物理アドレスを伝えるのか?

    一般的なシステムにおいて、プログラムを実行するには、コンパイラが再配置可能なオブジェクトファイルにして、そのオブジェクトファイルをローダがメモリ上にローディングして、CPUによって実行が行われると認識しています。 では、実際にCPUにより実行される時に、どのようにしてCPUは、ローディングされている物理アドレスを知ることが出来るのですか?一番初めにOSがどのようにCPUに先頭番地を伝えているのかが見当がつきません。例えば、486では、セグメントレジスタの値とオフセットアドレスを加算したアドレスを基にメモリとやり取りしていますが、OSがこのセグメントレジスタに先頭アドレスをどのように格納しているのかを教えてください。お願いします。

  • USBメモリの直接書き換え方法について(Linux)

    LinuxでUSBメモリを(可能ならば)特殊用途で使ってみようと思っています。 ファイルシステム等を完全に無視して、USBメモリの先頭から256/512/1Kバイト単位(任意)で、とにかくデータを読み書きしたく思っているのです。 たとえばUSBメモリの先頭から256バイトは1234 ..のインクリメントパターン、次の256バイトはすべて1、次の256バイトは9876 ・・ のパターン等のような書き込み、読み出し制御です。 Linuxのioctl関数等を使用したアプリケーションを作成して、こういうことを実現することは可能でしょうか? もし可能ならその方法をアドバイスいただけると助かります。 どなたかよろしくお願いします。 ※ ファイルシステム等を完全に破壊して、Linuxのファイルシステムとして読めなくなってもかまいません。

  • メモリアドレスについて

    こんにちは サーバをアセンブラで出力したデータを参考にして、クライアントを作っています そこで、アセンブラで出力したデータを使っても、サーバの実行時にはメモリアドレスは変わるものでしょうか もしそうであれば、今やってる事は全て無駄になってしまいます よろしくお願いします

  • 実アドレスのデータの読み込み

    DDR SDRAMのメモリの実アドレスを指定して、そのアドレスからデータを読み込むコードを検証しています. 【実行環境 】 OS :Windows XP API側で取得出来る情報 :実アドレス、データサイズ ソフト :WindowAPI 実アドレスを指定して、先頭の8バイトを読み込む場合、以下のコードで問題ないのでしょうか? unsigned long lAdress; //実アドレスになります。 char n = 0; int *p; //ポインタ p = lAdress; //実アドレスの格納 n = *(p+0); //実アドレスの先頭の8バイトの情報を格納 n = *(p+1); //実アドレスの次の8バイトの情報を格納 Windowsではプロテクトモードのため、実アドレスアクセスが不可能なのでしょうか?その場合、何か方法はあるのでしょうか? 以上、アドバイスをいただけると幸いです.

  • メモリをアドレスを直接指定して値を取得するには

    マイコンのプログラムを書いております。 やりたい事はC言語でフラッシュメモリの物理アドレスを直接指定してそのアドレスの値を1バイト読むことです。例えば0xF000番地のアドレスから1バイト読む場合、以下のソースコードで問題ありますでしょうか?なおアドレスは2バイトで表現されます。 unsigned char *p_value; unsigned char value; p_value=&value; p_value=0xF000; この時点で変数valueには0xF000番地の値が正確に代入されてますでしょうか? よろしくお願いします。

  • Jpegファイルのロード・先頭アドレス取得

    ある関数の引数にJpegファイルをメモリ上にロードした時の 先頭アドレス(ポインタ)を渡したいのですが、ロードして 先頭アドレスを取得する方法が分かりません。 CImageクラス等でロードは出来たのですが、ファイルの先頭アドレス を取得で出来ません。 何方かお分かりになる方、教えてください。 また、メモリ展開後に先頭アドレスが分かったとしたら、 その後、Jpegファイルとして再び指定パスに保存することは 可能なのでしょうか? 可能だとしたら、合わせて方法を教えていただけると ありがたいです。 Jpeg等の画像ファイルを扱うことが初めての為、困って おります。よろしくお願いいたします。 開発環境 : Win2k, VC++.Net 2003, MFC

  • メモリ不足について

    パソコンの事で質問したいんですが… 私はパソコンで最近絵を描き始めて、今回GIMPと言うソフトを買ったのでさっそくインストールしてみようとCD-ROMをセットしたんですがインストールされませんでした。 何が原因なのだろうかとパソコンを見てみたら、メモリ不足?みたいで…… GIMPのCD-ROMをセットしたら、GIMP-ROMと書かれていてDドライブが0バイトになってました。 これがもしかして原因でインストール出来ないのかと思い、色々調べて不要なファイルやマイピクチャなどを消去してみました。 それでも残り0バイトで何も変わらなくて…… メモリ不足の場合どうしたらいいんでしょうか? パソコンの事は全くわからず、どうしたらいいのかわからなくて困ってます。 もしも、何かわかる方がいらっしゃったら是非教えて頂きたいです!質問が下手くそですみません…; 因みにネットなどには繋げていません。

  • メモリについて

    メモリアドレスの説明の時に、1byteは8bitと、1つの番地を示す時に 00000000~FFFFFFFFなどの表が使われてますが、 1bitって0,1の2つまでなのに、それぞれの桁にF(0~15)までの値が入れられるのがわかりません。 各桁(1bit)の中も4つに区切られているのですか? 頓珍漢な質問かもしれませんが、よろしくお願いします。

  • ポインタで、実装メモリの先頭から100バイト分参照してみたい

    いつもお世話になります。 Cの質問です。 ポインタの勉強中なのですが、ポインタを用いて、実装メモリの先頭から100バイト分を参照してみたい、と思いました。 先輩が言うには「メモリの先頭領域にはメモリのメーカーとか、文字コードが順番に入ってるよ」とのことなのですが、どうにもプログラムが作れません。 mallocでは、どうやら「コンパイル時にメモリ領域を確保する」らしく、指定したメモリ位置(つまりアドレス0)からxxバイト分確保することはできないようです。 私が試しに書いてみたソースは以下になります。 #include<stdio.h> #include<stdlib.h> int main(void){ int i; char *p; p = (char*)malloc(sizeof(char) * 100); for (i=0;i<100;i++){ printf("%c",*p); p++; } return (0); } アドバイスでもかまいませんので、ご指導いただけたらと思います。 よろしくお願いいたします。