vmlinux的生成

#
# 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)

  1. 由根目录下的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文件。

  1. 处理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
piggy.o数据
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/20181117123057501.png
说明:
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
VMA=LMA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值