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のヘッダにある.dataセクションの転送先情報は元をたどるとMakefileに記載されたstack:3136kの記述ということになります。 結局私の書いたリンカースクリプトとオリジナルのHariboteOSとではデータセクションのメモリ上の配置が異なっていることになります。 それにしてもなぜこんな面倒な処理になっているのでしょうか…?[ .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 : コード