2009年8月10日月曜日

decompress_kernel

前回、decompress_kernelをコールして圧縮されたカーネルを解凍するところまで見ました。
decompress_kernelで解凍してもらっている圧縮された部分を探してみよう、というのが
今回の予定でした。
が、、、調べてみてもどうにも理解できず。
力不足です。

今後のためにどこまで分かって何が分からないかをメモしておきます。

decompress_kernelの入力として渡している解凍元は以下のように指定されています。
====
leal input_data(%ebx), %eax
====

input_dataを探してみると、多分以下の部分に当たると思います。

arch/x86/boot/compressed/vmlinux.scr
====
SECTIONS
{
.rodata.compressed : {
input_len = .;
LONG(input_data_end - input_data) input_data = .;
*(.data)
output_len = . - 4;
input_data_end = .;
}
}
====

そこでリンク時にこのvmlinux.scrを参照しているのはどこだろうかとMakefileを
調べてみます。

arch/x86/boot/compressed/Makefile
====
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
$(call if_changed,ld)
====

piggy.oというのがinput_dataに相当するのかな、と想像。
この元になっているvmlinux.bin.gzの出所を順々に調べてみます。

====
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
$(call if_changed,gzip)
====
$(obj)/vmlinux.bin: vmlinux FORCE
$(call if_changed,objcopy)
====
$(obj)/vmlinux: $(src)/vmlinux_$(BITS).lds $(obj)/head_$(BITS).o $(obj)/misc.o $(obj)/piggy.o FORCE
$(call if_changed,ld)
====

また、piggy.oに帰ってきてしまった。。
想像に想像を重ねたような推測で進めているので、途中の想定で大きな方向間違いがあるのかもしれません。
この部分についてはまたいずれ、出直してきます。。。

0 件のコメント:

コメントを投稿