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

A 回答 (3件)

模範的には再配置(relocation)という技術を使っているというのが正解ですね。



再配置には、静的再配置と動的再配置があります。前者は、メモリに入れる
(ロードする)前に各アドレスの参照部分を修正することで再配置をします。
そのためには、どこでアドレスを参照しているかを別に記録しておく必要があ
ります。後者は、すべてのアドレスをPCに対して相対的に参照するようにプロ
グラムを構成しておき、アドレスを参照するときにプロセッサが自動的に目的
アドレスを生成することで、再配置を達成します。これらのいずれかが可能な
プログラムのことを、再配置可能(relocatable)なプログラムといいます。

ところが、UNIXなんかでは、ロードモジュール本体はいわゆる再配置可能になっ
ていません。ほとんどのプログラムは固定の番地にロードされることを前提に
作成されています。近代的なプロセッサはプログラムが利用する論理アドレス
を動的にメモリが利用する物理アドレスに変換するような装置を内部または外
部に備えています。プロセスの切替えごとに、そのアドレス変換表をとりかえ
れば、マルチプロセッシングが可能というわけです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/05/23 11:01

x86系CPUではプロテクトモード下ではアドレス変換を使って


それぞれのプログラムが独立した連続のアドレス空間下で実行されます
実際にはそれぞれのプログラムの論理アドレス空間事にどの実アドレス空間にマッピングされるかという情報をセットしてあり、CPUがメモリを参照するときにマッピングテーブルを見て実メモリのアドレスを取得し、アクセスします

詳細は参考URLの「はじめて読む485」という本を読んでみてください

参考URL:http://www.amazon.co.jp/exec/obidos/ASIN/4756102 …
    • good
    • 0

オブジェクトプログラムは全部0番地から作られますが、連係編集プログラム(リンケージエディタ) and/or ローダの働きで実際にローディングされるアドレスに従って、プログラムの実行に支障がでないよう処置が採られますのでご安心下さい。

変数の番地やジャンプ先の番地も必要が有れば上記のプログラムたちが書き換えてくれます。従って問題は起きないはずです。

この辺の方式はハードやOSとの組み合わせで色々あって簡単には説明できません。書籍の目次で、あまり親切ではありませんが「参考URL」の中で「再配置」というキーワードがその部分です。

なお、普通はメモリーの先頭にOSが入っていますので、先頭のAPも0番地からは入れず、上記の仕組みで再配置されています。

参考URL:http://www.shoko-do.co.jp/infobooks/ISBN4-7856-3 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/05/23 11:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q環境変数とシェル変数

UNIXのシェルスクリプトで使用するシェル変数と環境変数とはどういった違いがあるのでしょうか?どのように使い分ける必要があるのでしょうか?また、このような使い方をすると間違いがおこりやすいといった具体的な例など教えていただければ助かります。

Aベストアンサー

環境変数はforkした子プロセス(及び子シェル呼び出し)に引き継がれ、呼ばれた子プロセスはそれらを参照する事が出来ますが、シェル変数は子プロセスには引き継がれません。

子プロセスが親からの情報を受け取って何かしたい時に環境変数を使います。

QBluetoothイヤホンの音飛び

Bluetoothイヤホン QCY-Q26を購入し、DellのWinows10ノートパソコン(Windows7よりUpGrade)にペアリングしましたが、音がブツブツ途切れてしまいます。
QCY-Q26は、他のパソコンやスマホで使った場合は問題無く非常に良好に使えます。

何とか改善する方法はないでしょうか?

Aベストアンサー

どうしたものでしょうかねぇ…私もwin10は導入当時(同じく、無料アップグレードです。)からバグが多いのでそれの類いかもしれません。他のパソコンで操作出来るのなら、イヤホン自体に問題はないと思うのですが…何か急ぎのプロジェクトなら、データを他のパソコンに移して進めることおすすめします。ちなみに、私はUSBメモリの接続表示がなく、安全に取り出す作業が出来ませんでした。強制的に引っこ抜いてましたw(やっちゃダメですよ!)素人にもかかわらずでしゃばって申し訳ありません。

Qアプリケーションエラー  0x77f58dc5 の命令が…

0x77f58dc5 の命令が "0x000036f9" のメモリを参照しました。メモリが"read"になることはできませんでした。プログラムを終了するには[OK]をクリックしてください」 と出ました。OKをクリックしても何度も同じ文が出てきます。どうしたらいいでしょうか…

Aベストアンサー

 こんにちは。

 参考URLの二つめにあるような,横長のエラーメッセージですね。

 この場合は,[キャンセル]ボタンを押して,デバッガを起動するようにしても,だめでしょうか。

 この問題は多くのユーザーの方を悩ませているようです。わたしもその一人でした。

 このエラーメッセージを解決しないでおくと,起動時などの使用に支障をきたす,ということでなければ,次のようにすればよいかと思います。

 通常の環境では,マイクロソフトInternet Explorer上の[エラー報告]ダイアログで「報告しない」,に設定すると、アプリケーション・エラー発生時に何のダイアログも表示しないようにできます。

 しかし,質問者様のご指摘の種類のエラーメッセージダイアログボックスは,Visual Studio .NETをインストールしている場合だと、マイクロソフトの[エラー報告]ダイアログで「報告しない」設定にしていても,画面上に出てくると言うことのようです。
 
 質問者様の場合は,次の参考URLの様に(Windowsワトソン博士)「ドクターワトソン」をインストールすることで解決できます。
 アプリケーション・エラー発生時に,何のエラーメッセージダイアログも表示しないようにします。
 
 その方法はつぎの通りです。
 「スタートメニュー」⇒「アクセサリ」⇒「コマンド・プロンプト」をクリックして,開きます。
 カーソルキーの点滅する場所で,参考URLページの最後の通りに打ち込んで,Enterキーを押します。
              
 尚,exeの後には半角のスペースを打ちます。
再起動をすると,もうエラーメッセージは現れません。

 一度お試しになってはいかがでしょうか。

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/262apperror/apperror.html

 こんにちは。

 参考URLの二つめにあるような,横長のエラーメッセージですね。

 この場合は,[キャンセル]ボタンを押して,デバッガを起動するようにしても,だめでしょうか。

 この問題は多くのユーザーの方を悩ませているようです。わたしもその一人でした。

 このエラーメッセージを解決しないでおくと,起動時などの使用に支障をきたす,ということでなければ,次のようにすればよいかと思います。

 通常の環境では,マイクロソフトInternet Explorer上の[エラー報告]ダイアログ...続きを読む

Qサブネットに分割したらnslookup命令で逆引きできなくなった

よろしくお願いします。
NTTから借りているルータ内蔵型モデムのDMZホスト機能とやらを使ってみようと思い自宅ウェブサーバをDMZ領域に設置することにしました。
そのため今まで使っていたクラスCのプライベートアドレスを2つのサブネットに分割してネットワーク192.168.1.128をDMZ領域にしました。
それで、やっとこさウェブサーバのIPアドレスの変更やネームサーバの設定などを終えて通信できるようになったのですが
どうもリナックスのnslookup命令で逆引きしようとすると
** server can't find 130.1.168.192.in-addr.arpa: NXDOMAIN
と表示されるだけで名前解決が出来ません。
またnamed.confファイルと逆引き用のゾーンファイルを元の192.168.1.10に戻すと逆引きできるようになるという何とも不思議な現象なのです。
別に逆引きが出来なくても普通に通信が出来ているのだから問題ないのですが、やっぱりちょっと気持ちが悪いですよね。
ネットワークをサブネットに分割したのが関係しているのか、とかいろいろ考えてみたのですけど、いっこうに出来ないので、ここに聞きに来ちゃいました。
逆引きが出来ない原因に心当たりのある方はいらっしゃいますか。
どなたか教えてください。

よろしくお願いします。
NTTから借りているルータ内蔵型モデムのDMZホスト機能とやらを使ってみようと思い自宅ウェブサーバをDMZ領域に設置することにしました。
そのため今まで使っていたクラスCのプライベートアドレスを2つのサブネットに分割してネットワーク192.168.1.128をDMZ領域にしました。
それで、やっとこさウェブサーバのIPアドレスの変更やネームサーバの設定などを終えて通信できるようになったのですが
どうもリナックスのnslookup命令で逆引きしようとすると
** server can't find 130.1.168...続きを読む

Aベストアンサー

#6お礼より
>すると、なんてことでしょう!!依然として反応は遅いままです。
>これでは、ますます原因が分からなくなってしまいましたね。
>
いえいえ、かなり前進です。
少なくともルータは関係なかったので絞り込めます。

まず、現在サーバとクライアントが別セグメントになってしまっているので、
同一セグメントにしてみてください。
例えば
 サーバ:192.168.1.130/255.255.255.128
 クライアント:192.168.1.131/255.255.255.128

あと、SSH接続ということで、これも切り分けの為に、
SSHを使わずtelnetやftp接続を行ってみていただけますでしょうか。
(これは別セグメントの場合と同一セグメントの場合それぞれチェックしてみてください)

Q環境変数の設定方法

UNIXでsolaris2.8を使っているのですが、
環境変数の設定がどうやらくるってしまったようで最初に端末エミュレーターをたちあげた時にHOMEディレクトリではなくちがう場所へ行ってしまいます。”cd”と打てばHOMEディレクトリへ戻るのですが・・・どうしたら直るのでしょうか?

Aベストアンサー

使用するシェルを変更されませんでしたか?
passwdファイルに記述されているシェルと違うものを使用されているのでしたらそのシェルのプロファイル(例えばbashなら.bashrc)がホームディレクトリにあるか確認しましょう。
無い場合はどこかにサンプルになるものが有るはずですので引っ張ってきて設定しましょう。


人気Q&Aランキング

おすすめ情報