英語

RISC-V Linux 中的啟動映象頭

作者:

Atish Patra <atish.patra@wdc.com>

日期:

2019 年 5 月 20 日

本文件僅描述 RISC-V Linux 的啟動映象頭詳細資訊。

解壓後的 Linux 核心映象中存在以下 64 位元組的頭

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 stub。 EFI 規範需要在核心映象的開頭包含 PE/COFF 映象頭,以便將其作為 EFI 應用程式載入。為了支援 EFI stub,code0 被替換為“MZ”魔術字串,res3(偏移量為 0x3c)指向 PE/COFF 頭的其餘部分。

  • version 欄位指示頭版本號

    位 0:15

    次版本

    位 16:31

    主版本

    這保持了新舊頭版本之間的相容性。 當前版本定義為 0.2。

  • “magic”欄位已從 0.2 版本開始棄用。 在將來的版本中,可能會將其刪除。 這最初應該與 ARM64 頭“magic”欄位匹配,但不幸的是沒有。 “magic2”欄位取代了它,與 ARM64 頭匹配。

  • 在當前頭中,flags 欄位只有一個欄位。

    位 0

    核心位元組序。 如果是 BE,則為 1;如果是 LE,則為 0。

  • 映象大小對於引導載入程式載入核心映象是強制性的。 否則,啟動將失敗。