teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

文章表現を、読みやすく修正

2016/09/26 15:15

投稿

rubato6809
rubato6809

スコア1382

answer CHANGED
@@ -15,7 +15,7 @@
15
15
  逆に、論理アドレスが同じなら、物理アドレスも同じ…とはなりません。論理アドレスが同じだろうが違っていようが、おそらく**毎回全く異なる物理アドレスが割り当てられる**のだろう、と想像していればよいと思います。
16
16
  ユーザプログラムの動作とは、即ちCPUの動作です。繰返しますが、CPUが扱う(=アクセスできる)アドレスは論理アドレスだけです。その論理アドレスに対応する物理アドレスがどこかなんて、OSか物理デバイスドライバをデバッグするのでもなければ私達に関わりの無い事、そう割りきって構わないと思います。
17
17
 
18
- 念の為:論理アドレスを物理アドレスに変換する装置が[メモリ管理ユニット(MMU)](https://ja.wikipedia.org/wiki/メモリ管理ユニット)です。CPU、論理アドレス(virtual address)、物理アドレス(physical address)の関係は、[MMUの動作の模式図](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:MMU_principle_updated.png)が単純でわかりやすい(少なくとも私にはw)。論理アドレスと物理アドレスの対応付けをするのが[ページテーブル](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)であり、ページテーブル設定はOSの仕事です。
18
+ 念の為:論理アドレスを物理アドレスに変換する装置が[メモリ管理ユニット(MMU)](https://ja.wikipedia.org/wiki/メモリ管理ユニット)です。CPU、論理アドレス(virtual address)、物理アドレス(physical address)の関係は、[MMUの動作の模式図](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:MMU_principle_updated.png)が単純でわかりやすい(少なくとも私にはw)。論理アドレスと物理アドレスの対応付けをするのが[ページテーブル](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB)であり、ページテーブル設定するのはOSの仕事です。
19
19
  MMUを持たないコンピュータもあります。その場合、論理アドレスはそのまま物理アドレスとなってメモリをアクセスします。
20
20
 
21
21
  > 1回目はランダム化できています。2回目はできていません。
@@ -25,7 +25,7 @@
25
25
 
26
26
  スタック領域は、プロセス起動時にスタックポインタを正しくセットしさえすれば、何番地でも支障なくプログラムは動作します。malloc()が返すメモリアドレスは、元々何番地が割り当てられるか実行するまでわからないのだから、実行の都度アドレスが変化しても動作に支障などあるはずが無い。つまり、これらのデータ領域はランダム化が容易です。
27
27
 
28
- ところが、プログラム自体(機械語コード)は、一般にロードするアドレスを変えると動作できなくなります。[位置独立コード](https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%BD%AE%E7%8B%AC%E7%AB%8B%E3%82%B3%E3%83%BC%E3%83%89)を参照して下さい。「PIE」(Position Independent Executable: 位置独立実行形式)とは、ロードするアドレスが変わっても動作できる機械語コードの事です。特別な呼び名が有るくらい普通じゃない、と言えます。"-fPIE -pie"コンパイルオプションはPIEコードにコンパイルする指定です。
28
+ ところが、プログラム自体(機械語コード)は、一般にロードするアドレスを変えると動作できなくなります。[位置独立コード](https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%BD%AE%E7%8B%AC%E7%AB%8B%E3%82%B3%E3%83%BC%E3%83%89)をご覧下さい。「PIE」(Position Independent Executable: 位置独立実行形式)とは、ロードするアドレスが変わっても動作できる機械語コードの事です。特別な呼び名が有るくらい普通じゃない、と言えるでしょう。"-fPIE -pie"コンパイルオプションはPIEコードにコンパイルする指定です
29
29
  即ち、機械語コード(プログラム自体)のランダム化は、**PIEコードにコンパイルする必要がある**程度に、容易ではないのです。
30
30
 
31
31
  おまけ:テストプログラムは一本化できます。