3日目 その3

32ビットモードへの道 その2

前回はbootpack用のリンカースクリプトを書きましたが、今回はオリジナルのHariboteOSがそこらへんをどう処理しているかという話。

ちなみに32ビットモードへの移行についてはOS自作本の8日目に書いてあるのですが、データセクションの配置(3つめのmemcpyの話)に関しては後述となっています。
(まだ最後まで読んでないのでわかりませんがパッと見たかんじ、P.459がそれにあたるんでしょうか?)


そもそもオリジナルのリンク処理がMakfileのどこに書いてあるかというと、この部分です。

bootpack.bim : $(OBJS_BOOTPACK) Makefile
	$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \
		$(OBJS_BOOTPACK)

OBJ2BIM(=obj2bim)がリンカでRULEFILE(=haribote.rul)がリンカースクリプトに相当します。
haribote.rul内のメモリ配置に関する部分はこうです。
(.rulファイルの説明はhttp://hrb.osask.jp/wiki/index.php?tools%2Fobj2bim)

format:
	/* このセクションでリンクの方針を記述 */
	code(align:1, logic:0x24,      file:0x24);
	data(align:4, logic:stack_end, file:code_end);

stack_endにはobj2bimの引数stack:3136k(=0x310000)が入るようです。
つまりbootpackはデータセクションが0x310000からはじまるものとしてリンクされています。


あれ、でもデータセクションって0x310000にあるんでしたっけ?
(前回のリンカースクリプトではデータセクションは0x280000 + SIZEOF(.text)の位置あります)
ということで、OS自作本の8日目で後回しにされたの3つ目のmemcpyの話になります。
要は、3つ目のmemcpyはデータセクションを0x310000に転送しているのです。
転送元や転送先についてはOS自作本8日目にもあるようにbootpack.hrbのヘッダに記載されています。

[ .hrbファイルの構造 ]

+ 0 : stack+.data+heap の大きさ(4KBの倍数)
+ 4 : シグネチャ "Hari"
+ 8 : mmarea の大きさ(4KBの倍数)
+12 : スタック初期値&.data転送先
+16 : .dataのサイズ
+20 : .dataの初期値列がファイルのどこにあるか
+24 : 0xe9000000
+28 : エントリアドレス-0x20
+32 : heap領域(malloc領域)開始アドレス
+36 : コード
.hrbのヘッダにある.dataセクションの転送先情報は元をたどるとMakefileに記載されたstack:3136kの記述ということになります。 結局私の書いたリンカースクリプトとオリジナルのHariboteOSとではデータセクションのメモリ上の配置が異なっていることになります。 それにしてもなぜこんな面倒な処理になっているのでしょうか…?