2013-11-23 48 views
1

我尝试了解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

==========================================

我的问题是:

  1. 图像类型是未压缩的,这意味着我们不压缩vmlinux中的zImage来?

  2. 加载地址:20008000:这是在arch/arm/boot/Makefile中定义的解压缩图像的地址= ZRELADDR? 这个地址也是../arm/kernel/head.o的地址吗? 看来我们不使用地址KERNEL_PHYS,这种方法是常用的方式还是只适用于AT91SAM系列?

  3. 基本上,我们的程序建立和启动是:

一个。构建内核步骤:vmlinux - > uImage(跳过创建zImage)。

b。内核启动步骤:DataFlash/NAND --load - > uImage(@ 0x22200000) - 解压缩 - >未压缩映像(@ 0x20008000)。

在这种情况下,在启动过程中没有zImage,尽管在构建消息中我看到了zImage的创建。我错了 ?

4。那么我在/arch/arm/kernel/vmlinux.lds中找到的地址0xC0008000如何处理: 。 = 0xC0000000 + 0x00008000; 我们用它吗?我把这个地址与ZRELADDR混淆了。

问候。

回答

2
  1. uImage文件最有可能是使用zImage构建的。它表示未压缩,因为uImage本身没有压缩。

  2. 加载地址可以被启动加载程序用来存储对Linux内核启动的初期阶段的数据(在引导加载程序定义的命令行等)。

  3. 你说得对关于启动过程。但是,当使用zImage时,解压由内核而不是引导加载程序完成。见decompress_kernel()

  4. 地址0xc0008000是一个虚拟地址。它映射到物理地址0x20008000。虚拟地址只能在Linux建立内存转换(MMU)之后使用。

+0

您好克里斯托弗奥吉尔, 万一有在构建过程中使用的zImage,然后启动过程将是: **的uImage(数据闪存/ NAND)** --- --- load_to_RAM> **的uImage (@ 0x22200000)** --- decompress_uImage - > ** zImage(@ KERNEL_PHYS)** --- decompress_zImage ---> **未压缩的图像(@ 0x20008000)**。 那么,我们得到** KERNEL_PHYS **? 谢谢 –

+0

我认为上面的地址KERNEL_PHYS应该是“ZTEXTADDR”。从命令:bootm $ {kernel_addr},u-boot代码将uImage从kernel_addr解包到ZTEXTADDR,但我无法在任何地方获得ZTEXTADDR。 –

+0

其实我不认为有一个步骤decompress_uImage。一旦uImage被处理,它的有效载荷(内核zImage)被拷贝到0x22200000,然后pc跳到这个相同的地址。然后Linux解压缩完成,最终的图像在0x20008000解压缩。 –