![](https://csdnimg.cn/release/download_crawler_static/3839540/bg4.jpg)
ZTEXTADDR 就是解压缩代码的 ram 偏移地址,ZRELADDR 是内核 ram 启动的偏移地
址,这里看到指定 ZTEXTADDR 的地址为 0,
明显是不正确的,因为我的平台上的 ram 起始地址是 0xa0000000,在 Makefile
文件中看到了对该地址设置的几行注释:
# We now have a PIC decompressor implementation. Decompressors running
# from RAM should not define ZTEXTADDR. Decompressors running directly
# from ROM or Flash must define ZTEXTADDR (preferably via the config)
他的意识是如果是在 ram 中进行解压缩时,不用指定它在 ram 中的运行地址,如
果是在 flash 中就必须指定他的地址。所以
这里将 ZTEXTADDR 指定为 0,也就是没有真正指定地址。
在 kernel/arch/arm/boot/compressed/Makefile 文件有一行脚本:
SEDFLAGS =
s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;s/BSS_START/$(ZBS
SADDR)/
使得 TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。
这样 vmlinux.lds 的生成过程如下:
vmlinux.lds: vmlinux.lds.in Makefile
$(TOPDIR)/arch/$(ARCH)/boot/Makefile $(TOPDIR)/.config
@sed "$(SEDFLAGS)" < vmlinux.lds.in > $@
以上就是我对内核启动地址的分析,总结一下内核启动地址的设置:
1、设置 kernel/arch/arm/Makefile 文件中的
TEXTADDR = 0xC0008000
内核启动的虚拟地址
2、设置 kernel/arch/arm/boot/Makefile 文件中的
ZRELADDR = 0xa0008000
内核启动的物理地址
如果需要从 flash 中启动还需要设置
ZTEXTADDR 地址。
linux启动流程分析(3)---内核解压缩过程
内核压缩和解压缩代码都在目录 kernel/arch/arm/boot/compressed,
编译完成后将产生 vmlinux、head.o、misc.o、head-xscale.o、piggy.o 这几个
文件,
head.o 是内核的头部文件,负责初始设置;
misc.o 将主要负责内核的解压工作,它在 head.o 之后;
head-xscale.o 文件主要针对 Xscale 的初始化,将在链接时与 head.o 合并;
piggy.o 是一个中间文件,其实是一个压缩的内核(kernel/vmlinux),只不过没
有和初始化文件及解压文件链接而已;
vmlinux 是(没有--lw:zImage 是压缩过的内核)压缩过的内核,就是由
piggy.o、head.o、misc.o、head-xscale.o 组成的。