#
# linux/arch/i386/boot/compressed/Makefile
#
# create a compressed vmlinux image from the original vmlinux
#
targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o
EXTRA_AFLAGS := -traditional
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup_32
$(obj)/vmlinux: $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o FORCE
$(call if_changed,ld)
@:
$(obj)/vmlinux.bin: vmlinux FORCE
$(call if_changed,objcopy)
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
$(call if_changed,gzip)
LDFLAGS_piggy.o := -r --format binary --oformat elf32-i386 -T
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
$(call if_changed,ld)
- 由根目录下的vmlinux生成compressed/vmlinux.bin
cmd_arch/i386/boot/compressed/vmlinux.bin := objcopy -O binary -R .note -R .comment -S vmlinux arch/i386/boot/compressed/vmlinux.bin
去除符号之类的信息,用objcopy把vmlinux转换成raw binary.vmlinux.bin是个可执行的镜像。会先压缩这个,在内核启动过程中,再解压压缩文件。
2.压缩vmlinux.bin生成vmlinux.bin.gz
cmd_arch/i386/boot/compressed/vmlinux.bin.gz := gzip -f -9 < arch/i386/boot/compressed/vmlinux.bin > arch/i386/boot/compressed/vmlinux.bin.gz
在内核启动的过程就是解压vmlinux.bin.gz文件。
- 处理vmlinux.bin.gz生成piggy.o
cmd_arch/i386/boot/compressed/piggy.o := ld -m elf_i386 -r --format binary --oformat elf32-i386 -T arch/i386/boot/compressed/vmlinux.scr arch/i386/boot/compressed/vmlinux.bin.gz -o arch/i386/boot/compressed/piggy.o
vmlinux.scr 文件中
SECTIONS
{
.data : { ------------------------>输出文件的节叫.data
input_len = .;-->符号标记地址
LONG(input_data_end - input_data) input_data = .; --〉存放vmlinux.bin.gz的长度; input_data标记vmlinux.bin.gz的开始
*(.data) -------------->拷贝输入的文件vmlinux.bin.gz的data节内容
input_data_end = .; ----------〉标记vmlinux.bin.gz的结束
}
}
objdum -s piggy.o
说明:
1)piggy.o的前四个字节637f1400也就是0x00147f73,是vmlinux.bin.gz的长度,长度=0x147f63=0x147f66-0x4+1=0x147f63。
2)蓝色框对应相应的数据,也就是把vmlinux.gz数据拷贝到piggy.o的data中。
4.通过piggy.o,misc.o,head.o生成vmlinux
cmd_arch/i386/boot/compressed/vmlinux := ld -m elf_i386 -Ttext 0x100000 -e startup_32 arch/i386/boot/compressed/head.o arch/i386/boot/compressed/misc.o arch/i386/boot/compressed/piggy.o -o arch/i386/boot/compressed/vmlinux
加载连接知识
LMA与VMA
LMA(Load Memory Address): the address at which the section will be loaded.
就是把你的程序中的对应的内容,详细点说就是,把其中的.text代码段,.data数据段等内容,搬到,也就是copy拷贝到,内存的LMA地址处了.
VMA(Virtual Memory Address):the address the section will have when the output file is run;
程序运行前,要把程序的内容,拷贝到对应的内存地址处,然后才能运行的。
代码要运行的时候,此时对应的地址,就是VMA。
很多时候,把程序搬移到什么地方,也在这个地方运行,所以LMA=VMA
ld -Ttext 0x100000
指定的是LMA和VMA地址,也就是LMA=VMA=0x100000