アプリ版:「スタンプのみでお礼する」機能のリリースについて

リロケータブルなプログラムはメモリのどの位置においても実行可能と聞きました。これは裏を返せばプログラムは性質などによってメモリに配置される場所がかわるということなのでしょうか?

A 回答 (3件)

そうですね。


たとえば、メモリ空間のアドレスを直接に指定しているプログラムだと、配置できるアドレスがきまってしまいます。コンパイル直後では指定されていなくても、リンク時にプログラム内部を置き換えるものもありましたね。

昔のマルチタスク管理システムが不十分だった頃には配慮しないといけなかったですが、現在ではほとんど意識することはないかと。
    • good
    • 0
この回答へのお礼

ありがとうございます。場所による違いとは具体的にはどんなことがあるのでしょうか?

お礼日時:2006/10/14 22:25

リロケータブルでないプログラムを期待されない領域にロードして実行すると、普通は暴走します。


例としてはgoto(jump)命令(ループ制御等に隠れたgoto含む)などのとび先に本来のプログラムがないので、どんな動きをするのかわかりません。
また、普通、プログラムは常に一定のメモリ領域にロードされることを期待できません。OSのコア部分のサイズが変わったり、各種ドライバの使用状況によってユーザープログラムが使用できるメモリの領域が変化するためです。
でも、最近のCPU/OSはメモリの仮想化(論理アドレスー物理アドレス変換・管理)ができるので、常に同じ論理アドレスで実行されることを期待してもいいのかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございます。本来のプログラムというところがよくわからなかったのですが、どういうことでしょうか?プログラムがメモリ上のどんな位置にロードされたとしてもでGOTOが使われたときは普通にそこにとぶだけではないのでしょうか?すいませんが、まだよくわかっていないみたいなのでもう少し詳しくお願いできますか?

お礼日時:2006/10/17 22:30

アセンブラレベルでは、アドレスの指定方法が大きく分けて相対アドレスと絶対アドレスがあることは知っていますか?


プログラムが1000番地から1999番地にロードされることを期待していて、goto命令の飛び先が絶対アドレス指定で1500番地だとします。
リロケータブルでない場合、プログラムが2000番地から2999番地にロードされても飛び先は1500番地のまま調整されないので、1500番地に飛びます。が、1500番地にはプログラムが無い=何があるかは不定なので、その後どうなるかは不定=ほぼ暴走になります。
リロケータブルの場合、大抵は相対アドレス指定されているはずなので、2500番地に飛ぶことになり、ここにはプログラムがあるので正常に処理が続けられます。
飛び先だけでなく、作業用のメモリも同様にでたらめな所を参照することになるので、誤動作の原因となります。
    • good
    • 0
この回答へのお礼

ありがとうございます。大変よくわかりました。それではほとんどのプログラムはリロケータブルだと考えてよいのでしょうか?

お礼日時:2006/10/18 19:44

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