我尝试了解ARM内核的编译和启动过程。我从www.kernel.org拿走了vanila linux,并在AT91SAM9260的运行配置之后构建它。 在我们编译内核的消息中显示:在AT91SAM9260中启动Linux内核
=================================== =======
LD的vmlinux
SORTEX vmlinux的
SYSMAP System.map
objcopy把拱/臂/引导/图像
内核:拱/臂/引导/图像准备就绪
GZIP拱/臂/引导/压缩/ piggy.gzip
AS拱/臂/引导/压缩/ piggy.gzip.o
LD拱/臂/引导/压缩/ vmlinux的
objcopy把弓/ ARM /开机/的zImage
内核:弓/ ARM /开机/的zImage准备
的uImage弓/ ARM /开机/ uImage执行
图像名称:Linux的3.9.1 +
创建:星期六11月23日18点15分58秒2013
图像种类:ARM Linux内核图像(未压缩)
数据大小:1635544个字节= 1597.21 KB = 1.56 MB
加载地址:20008000
入口点:20008000
图片拱/臂/引导/的uImage是重新ady
==========================================
我的问题是:
图像类型是未压缩的,这意味着我们不压缩vmlinux中的zImage来?
加载地址:20008000:这是在arch/arm/boot/Makefile中定义的解压缩图像的地址= ZRELADDR? 这个地址也是../arm/kernel/head.o的地址吗? 看来我们不使用地址KERNEL_PHYS,这种方法是常用的方式还是只适用于AT91SAM系列?
基本上,我们的程序建立和启动是:
一个。构建内核步骤:vmlinux - > uImage(跳过创建zImage)。
b。内核启动步骤:DataFlash/NAND --load - > uImage(@ 0x22200000) - 解压缩 - >未压缩映像(@ 0x20008000)。
在这种情况下,在启动过程中没有zImage,尽管在构建消息中我看到了zImage的创建。我错了 ?
4。那么我在/arch/arm/kernel/vmlinux.lds中找到的地址0xC0008000如何处理: 。 = 0xC0000000 + 0x00008000; 我们用它吗?我把这个地址与ZRELADDR混淆了。
问候。
您好克里斯托弗奥吉尔, 万一有在构建过程中使用的zImage,然后启动过程将是: **的uImage(数据闪存/ NAND)** --- --- load_to_RAM> **的uImage (@ 0x22200000)** --- decompress_uImage - > ** zImage(@ KERNEL_PHYS)** --- decompress_zImage ---> **未压缩的图像(@ 0x20008000)**。 那么,我们得到** KERNEL_PHYS **? 谢谢 –
我认为上面的地址KERNEL_PHYS应该是“ZTEXTADDR”。从命令:bootm $ {kernel_addr},u-boot代码将uImage从kernel_addr解包到ZTEXTADDR,但我无法在任何地方获得ZTEXTADDR。 –
其实我不认为有一个步骤decompress_uImage。一旦uImage被处理,它的有效载荷(内核zImage)被拷贝到0x22200000,然后pc跳到这个相同的地址。然后Linux解压缩完成,最终的图像在0x20008000解压缩。 –