我尝试了解ARM内核的构建和启动过程。我从www.kernel.org上获取了vanila linux,并在运行AT91SAM9260配置后构建它。 在我们编译内核的消息中显示:
==========================================
LD vmlinux
SORTEX vmlinux
SYSMAP System.map
OBJCOPY arch / arm / boot / Image
内核:arch / arm / boot / Image已准备就绪
GZIP arch / arm / boot / compressed / piggy.gzip
AS arch / arm / boot / compressed / piggy.gzip.o
LD arch / arm / boot / compressed / vmlinux
OBJCOPY arch / arm / boot / zImage
内核:arch / arm / boot / zImage准备就绪
UIMAGE arch / arm / boot / uImage
图片名称:Linux-3.9.1 +
创建时间:2013年11月23日星期六18:15:58
图像类型:ARM Linux内核映像(未压缩)
数据大小:1635544字节= 1597.21 kB = 1.56 MB
加载地址:20008000
切入点:20008000
图像拱/ arm / boot / uImage已准备好
==========================================
我的问题是:
图片类型未压缩,这意味着我们不会将vmlinux压缩为zImage?
加载地址:20008000:这是在arch / arm / boot / Makefile中定义的解压缩图像的地址= ZRELADDR? 这个地址也是../arm/kernel/head.o的地址? 看来我们不使用地址KERNEL_PHYS,这种方法是常见的方式还是只适用于AT91SAM系列?
基本上,我们构建和启动的过程是:
一个。构建内核步骤:vmlinux - > uImage(跳过创建zImage)。
湾内核启动步骤:DataFlash / NAND --load - > uImage(@ 0x22200000)--- decompress - >未压缩的图像(@ 0x20008000)。
在这种情况下,虽然在构建消息中我看到zImage已创建,但在启动过程中没有zImage。我错了?
4。我在/arch/arm/kernel/vmlinux.lds中找到的地址0xC0008000怎么样: 。 = 0xC0000000 + 0x00008000; 我们用它吗?我把这个地址与ZRELADDR混淆了。
问候。
答案 0 :(得分:2)
uImage文件很可能是使用zImage构建的。它表示未压缩,因为uImage本身没有被压缩。
引导加载程序可以使用加载地址来存储Linux内核引导早期阶段所需的数据(例如引导加载程序中定义的命令行)。
你对启动过程是正确的。但是当使用zImage时,解压缩由内核而不是引导加载程序完成。请参阅decompress_kernel()
地址0xc0008000是虚拟地址。它映射到物理地址0x20008000。只有在Linux设置内存转换(MMU)后才能使用虚拟地址。