RISC-V Linux 中的引导镜像头

作者:

Atish Patra <atish.patra@wdc.com>

日期:

2019 年 5 月 20 日

本文档仅描述 RISC-V Linux 的引导镜像头细节。

以下 64 字节的头存在于解压后的 Linux 内核镜像中

u32 code0;                /* Executable code */
u32 code1;                /* Executable code */
u64 text_offset;          /* Image load offset, little endian */
u64 image_size;           /* Effective Image size, little endian */
u64 flags;                /* kernel flags, little endian */
u32 version;              /* Version of this header */
u32 res1 = 0;             /* Reserved */
u64 res2 = 0;             /* Reserved */
u64 magic = 0x5643534952; /* Magic number, little endian, "RISCV" */
u32 magic2 = 0x05435352;  /* Magic number 2, little endian, "RSC\x05" */
u32 res3;                 /* Reserved for PE COFF offset */

此头格式符合 PE/COFF 头规范,并在很大程度上受到 ARM64 头格式的启发。因此,未来 ARM64 和 RISC-V 的头格式可以合并为一个通用的头格式。

备注

  • 此头也被复用于支持 RISC-V 的 EFI 存根(EFI stub)。EFI 规范要求内核镜像的开头包含 PE/COFF 镜像头,以便将其作为 EFI 应用程序加载。为了支持 EFI 存根,code0 被替换为“MZ”魔数字符串,并且 res3(位于偏移量 0x3c 处)指向 PE/COFF 头的其余部分。

  • version 字段表示头版本号

    位 0:15

    次版本号

    位 16:31

    主版本号

    这保持了头文件在较新版本和较旧版本之间的兼容性。当前版本定义为 0.2。

  • “magic” 字段自 0.2 版本起已被弃用。在未来的版本中,它可能会被移除。它原本应该与 ARM64 头的 “magic” 字段相匹配,但遗憾的是并没有。 “magic2” 字段取代了它,并与 ARM64 头相匹配。

  • 在当前的头中,flags 字段只有一个域。

    位 0 (Bit 0)

    内核字节序。1 表示大端(BE),0 表示小端(LE)。

  • 引导加载程序加载内核镜像时,镜像大小(Image size)是必需的。否则引导将失败。