2009年11月24日火曜日

【Linkers&Loaders】7 再配置

この章は、再配置の概要。主に再配置エントリの形式の紹介と再配置の計算方法を取り扱っている。リンカの出力ファイルは、再配置可能や再リンク可能にすることができ、それぞれリンカの出力として再配置用情報や再リンク用情報を含めることになる。

再配置の話題になるとアドレスがいろいろでてくるので、アドレスの計算について自分なりに整理した。

*** アドレスの計算いくつか
- アドレスの計算を簡単にできるようになりたい。
- そこで自分なりにまとめておく。
- 32ビットアーキテクチャでバイトアドレッシングを
想定する。
- するとアドレス空間のサイズは、K->M->G で、4Gであ
り、単一のアドレス空間にて取り扱えるメモリの最大
値は4GB。
- アドレスの2進数表記は32桁、16進数表記は8桁にな
る。
b: 00000000 00000000 00000000 00000000
x: 00 00 00 00

- すると、アドレス0x0から0x100がどれだけのバイト
サイズの領域かというと、16進数で100バイトという
こと。そうか、要は16進<->10進になれておけばいい
んだ。
- 16進と10進

0x00000001 <-> 16^0 = 1
0x00000010 <-> 16^1 = 16
0x00000100 <-> 16^2 = 256
0x00001000 <-> 16^3 = 4096
0x00010000 <-> 16^4 = 65536
0x00100000 <-> 16^5 = 1048567
0x01000000 <-> 16^6 = 16777216
0x10000000 <-> 16^7 = 268435456
0xFFFFFFFF <-> 16^8 - 1 = 4294967295

- 巾をつかった表示

0x00000001 <-> 16^0 = 2^0 = 1
0x00000010 <-> 16^1 = 2^4 = 16
0x00000100 <-> 16^2 = 2^8 = 256
0x00001000 <-> 16^3 = 2^12 = 4K
0x00010000 <-> 16^4 = 2^16 = 64K
0x00100000 <-> 16^5 = 2^20 = 1M
0x01000000 <-> 16^6 = 2^24 = 16M
0x10000000 <-> 16^7 = 2^28 = 256M
0xFFFFFFFF <-> 16^8 - 1 = 2^32 = 4G - 1

- 16進と割合

10進だと100の半分は50だ。では16進では?

0x100の半分は、

1234567 8 9ABCDEF

なので、0x80。そうか8は何かの半分なんだな。

10進とちがって1/4が表現しやすい。

0x100の1/4は、0x40、3/4は、0xC0、などなど。

さて、8は半分なので、32ビットアドレス空間の真ん
中あたりというのは、

0x80000000

ということ。

- 上位16ビットと下位16ビット

さて、アドレスを16で分割する。0x00010000 は64K
なので、上位16ビットは64K単位の領域を指定してい
うことになる。このあたりがセグメントシステムの
計算か。


こつこつ。

0 件のコメント: