• ベストアンサー

多重処理下のメモリ

一つのメモリ(0番地からMAX番地まで)に複数のプログラムを 置くと、番地はどうなるんですか? 特に、変数の番地やジャンプの命令の飛び先番地が、2つ目以降 のプログラムの場合どうなるんですか? 問題が起きた場合どういった解決方法があるのですか?

  • randy
  • お礼率44% (4/9)

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

  • ベストアンサー
回答No.2

模範的には再配置(relocation)という技術を使っているというのが正解ですね。 再配置には、静的再配置と動的再配置があります。前者は、メモリに入れる (ロードする)前に各アドレスの参照部分を修正することで再配置をします。 そのためには、どこでアドレスを参照しているかを別に記録しておく必要があ ります。後者は、すべてのアドレスをPCに対して相対的に参照するようにプロ グラムを構成しておき、アドレスを参照するときにプロセッサが自動的に目的 アドレスを生成することで、再配置を達成します。これらのいずれかが可能な プログラムのことを、再配置可能(relocatable)なプログラムといいます。 ところが、UNIXなんかでは、ロードモジュール本体はいわゆる再配置可能になっ ていません。ほとんどのプログラムは固定の番地にロードされることを前提に 作成されています。近代的なプロセッサはプログラムが利用する論理アドレス を動的にメモリが利用する物理アドレスに変換するような装置を内部または外 部に備えています。プロセスの切替えごとに、そのアドレス変換表をとりかえ れば、マルチプロセッシングが可能というわけです。

randy
質問者

お礼

どうもありがとうございます! とても助かりました!

その他の回答 (2)

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.3

x86系CPUではプロテクトモード下ではアドレス変換を使って それぞれのプログラムが独立した連続のアドレス空間下で実行されます 実際にはそれぞれのプログラムの論理アドレス空間事にどの実アドレス空間にマッピングされるかという情報をセットしてあり、CPUがメモリを参照するときにマッピングテーブルを見て実メモリのアドレスを取得し、アクセスします 詳細は参考URLの「はじめて読む485」という本を読んでみてください

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4756102131/qid%3D990643517/249-8326653-9173167
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

オブジェクトプログラムは全部0番地から作られますが、連係編集プログラム(リンケージエディタ) and/or ローダの働きで実際にローディングされるアドレスに従って、プログラムの実行に支障がでないよう処置が採られますのでご安心下さい。変数の番地やジャンプ先の番地も必要が有れば上記のプログラムたちが書き換えてくれます。従って問題は起きないはずです。 この辺の方式はハードやOSとの組み合わせで色々あって簡単には説明できません。書籍の目次で、あまり親切ではありませんが「参考URL」の中で「再配置」というキーワードがその部分です。 なお、普通はメモリーの先頭にOSが入っていますので、先頭のAPも0番地からは入れず、上記の仕組みで再配置されています。

参考URL:
http://www.shoko-do.co.jp/infobooks/ISBN4-7856-3508-8.html
randy
質問者

お礼

ありがとうございまっす! ローダとインケージエディタの本を探してみようと思います。

関連するQ&A

  • H8Sで割り込み発生時の飛び先アドレスがRAM上にある場合の割り込み関数の記述方法

    ルネサスのマイコンH8Sのプログラムを組んでおります。 プログラムの構成がBoot部分とアプリケーション部分に分かれており、 Bootはアドレス0番地から、アプリは3000番地以降の領域を使用するようになっています。 完成されたBootを使用してアプリケーションのプログラムを組まなければならなく、また、Bootは変更できないことになっています。 このBootの中のベクターテーブル上で、割り込みが発生した場合の飛び先のアドレスがRAM上になるように設定してあります。 このため、アプリケーションソフトでは、 割り込みが発生した場合のRAM上の飛び先に FLASH ROM上の指定したアドレスにジャンプする命令を書き、 FLASH ROMのジャンプ先には、実行したい関数を書きたいのですが、 (1)RAM上の特定のアドレスからFLASH ROM上の指定したアドレスにジャンプさせる方法。 (2)FLAH ROM上の指定したアドレスに関数を記述する方法。 を知りたいのですが、 どなたか教えて頂けないでしょうか? 開発環境はHew4 言語はC言語を使用しております。 私自身が理解不足であるため質問内容が伝わりにくいかと思いますが、 宜しくお願い致します。

  • C++でメモリの絶対番地を指定する方法はありますか。

    C++でメモリの絶対番地を指定する方法はありますか。 あるプログラムでメモリの指定した番地にデータを書き込み、別のプログラムで同じ番地のデータを読み込めるようにしたいと思ってます。プログラムは作ったのですが、絶対番地を指定していないようで、別のプログラム側で同じ番地を指定しても同じデータが読み込めません。

  • C言語におけるローカル変数が使用するメモリについて

    例のようなC言語のプログラムを動かした場合、 確保されるメモリ領域はどうなるのでしょうか。 例 #include <stdio.h> int main(void) { int a = 0; } このとき、変数aはint型なのでスタック領域に4バイトのメモリが確保されると理解しています。 と同時にaという変数名と確保されたスタック領域の番地を紐づけるようなメモリがどこかに確保されるのではないかと思ってるのですが、この理解で正しいでしょうか。 またその場合は変数aの番地はどの領域に確保されるのでしょうか。 ご教示お願いいたします。

  • プログラムカウンタの動き方

    プログラムカウンタは命令を実行するたびにカウンタに1を足して順次進行をしていくことはわかります。 ですがif文やwhile文はよく「もし大きければ004番地にジャンプする」などとたとえられています。 自分は順次進行しながら004番地まで命令を無視しているのか それとも本当に002、003のところを飛ばしているのかを考えています。 while文も同じく、001から009まで実行して、もし条件を満たしていなければ001に戻るというとき、プログラムカウンタは逆走して即座に001に戻るのでしょうか? それとも順次進行をしながら、001に戻るまで命令を無視しているのでしょうか? 自分が聞きたいのは、順次進行を守って命令を無視しているのか? それとも、逆走したり、ジャンプしたりしているのか? それとも、もっと別の手段があるのかということです。 よろしくお願いします。

  • メモリリークのデバッグ

    プログラムの実行時にエラーで停止してしまいます。 数値計算系のプログラムで反復計算を行っています。 数万回反復させても大丈夫なのに100万回くらい反復 計算するとプログラムが停止します。 場合によりパソコンがフリーズします。 メモリ関連が原因であることは想像できるのですが デバッグの方法がわかりません。計算の途中にでてくる 関数等でつかわれている変数でmallocしたものは全て 解放しているつもりですがどこかおちがあるのかもしれません。オチがある場合どこを解放しわすれているのか 現在つかめていません。 VCをつかっているのですがデバッガを使って実行途中の メモリの状態を確認する方法など、この問題を解決する 為に有効であると思われる方法をご存じでしたら教えて ください。 windows2000 visualC++6.0professional メモリ256MB

  • 機械語

    番地機械語ニモニック表記コメント 0 11101000 Shift 8 ;無駄な命令.ただしAccumulatorの内容は0になる 1 10011111 Store 31 ; Accumulator の内容を31 番地へ格納 2 01100001 Load 1 ; 1 番地のデータ(Store 命令) をAccumulator へ 3 01000110 Sub 6 ; 6 番地の内容(= 1) をAccumulator から引く 4 10000001 Store 1 ; 引いた結果を1 番地に格納 5 01100111 Load 7 ; 7 番地の内容(= 0) をAccumulator へ 6 00000001 Jump 1 ; 1 番地にジャンプする 7 00000000 0 ; 0 データの保管場所 このプログラムが停止するのはどんなときですか? これを実行したら3分くらい止まらなかったのですが・・・

  • 大人の科学マガジンVol.24 GMC-4について

    お世話になります。TK-80世代なので懐かしさのあまり、思わず買ってしまいました。 さて、当該雑誌の付録である4ビットマイコンのプログラムについて教えてください。 テキスト(?)の53ページ「タイマー」なのですが、これはサンプルとして内蔵されているソフトですが、これを1から作ろうとチャレンジしているのですが、どうしてもわからないことがあります。 それは、最初にタイマーセットということで00番地から02番地に、最初にデータを入力するというものですが、GMC-4の命令郡にはデータメモリのリード&ライト命令はあるものの、プログラムメモリ番地の内容を直接読む命令が見当たりません。 最初に50~52番地へデータを書き込むのなら話はわかるのですが、一体プログラムはどうなっているのでしょう?

  • 指定アドレスにジャンプさせたい場合【C言語】

    こんにちわ。 この度、初めてOK Waveから質問させて頂きます。どうぞ宜しくお願い致します。 現在、ルネサス製RX62Nを使ったマイコンボードを使用して、C言語によりプログラムを組んで様々な動作をさせているのですが、「RX62N内部のFlashROMの指定したアドレスにジャンプさせる方法」がうまくいかず、どなたか良い方法を教えて頂きたいと思います。 具体的には、変数Aに格納した値(32bit)をアドレスとして扱い、そのアドレスにジャンプしたいと考えています。 以前、他のかたの質問の回答で、  typedef void (*FN_PROGRAM)(void);  FN_PROGRAM pg = (FN_PROGRAM)0x20000000;  (*pg)(); という記述方法で20000000番地にジャンプできると記載があったため、早速、アドレスを0xFFFC0000に変更して動作させてみたところ、0xFFFC0000番地にジャンプさせる事ができ、大いに役に立ちました。 今回、私の方では、始めから0xFFFC0000番地と決め打ちせず、色々と計算をした後、最終的に決まったアドレスを変数Aに格納し、その格納した値をアドレスとして扱い、そこにジャンプさせる方法をとりたいと考えています。 お手数ですが、上記方法で、良い記述方法があればアドバイス頂けないでしょうか。できれば、使う変数Aの宣言文から教えて頂けると有難いと考えています。 説明が下手で申し訳ありません。C言語初心者ですので皆さまから色々とアドバイス頂けると助かります。よろしくお願い致します。、

  • IE7で「メモリが"written"になることはできませんでした」とのエラーが出る

    IE7を使用中、特定のサイトを開くと「"0x7d03f554"の命令が"0x0e654000"のメモリを参照しましたが、メモリが"written"になることはできませんでした。 プログラムを終了するには「OK」をクリックしてください。 プログラムをデバッグするには「キャンセル」をクリックしてください。」とのエラーが出てしまいます。 解決方法を教えてください。

  • SOS!メモリに関するエラーに悩まされています。

    タイトルの通り以下のエラーに悩まされています。 【"0x7c941010"の命令が"0x0000001c"のメモリを参照しました。 メモリが"read"になることはできませんでした。 プログラムを終了するには[OK]をクリックしてください】 ※"0x7c941010"と"0x0000001c"は番地が変わる事がある。 このエラーが発生したら最後。起動していたアプリケーションは強制終了させられ、今まで苦労して作成したDataは水の泡となってしまいます。また、最悪の時はアプリケーション本体も破壊することもあります。 もうSOS信号です!とにかく何でもいいので解決に関する情報を教えてください!どうかお願いします。