162306a36Sopenharmony_ci.. include:: ../disclaimer-zh_CN.rst 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci:Original: Documentation/riscv/boot-image-header.rst 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci:翻译: 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci 司延腾 Yanteng Si <siyanteng@loongson.cn> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci.. _cn_boot-image-header.rst: 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci========================== 1262306a36Sopenharmony_ciRISC-V Linux启动镜像文件头 1362306a36Sopenharmony_ci========================== 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci:Author: Atish Patra <atish.patra@wdc.com> 1662306a36Sopenharmony_ci:Date: 20 May 2019 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci此文档仅描述RISC-V Linux 启动文件头的详情。 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciTODO: 2162306a36Sopenharmony_ci 写一个完整的启动指南。 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci在解压后的Linux内核镜像中存在以下64字节的文件头:: 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci u32 code0; /* Executable code */ 2662306a36Sopenharmony_ci u32 code1; /* Executable code */ 2762306a36Sopenharmony_ci u64 text_offset; /* Image load offset, little endian */ 2862306a36Sopenharmony_ci u64 image_size; /* Effective Image size, little endian */ 2962306a36Sopenharmony_ci u64 flags; /* kernel flags, little endian */ 3062306a36Sopenharmony_ci u32 version; /* Version of this header */ 3162306a36Sopenharmony_ci u32 res1 = 0; /* Reserved */ 3262306a36Sopenharmony_ci u64 res2 = 0; /* Reserved */ 3362306a36Sopenharmony_ci u64 magic = 0x5643534952; /* Magic number, little endian, "RISCV" */ 3462306a36Sopenharmony_ci u32 magic2 = 0x05435352; /* Magic number 2, little endian, "RSC\x05" */ 3562306a36Sopenharmony_ci u32 res3; /* Reserved for PE COFF offset */ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci这种头格式与PE/COFF文件头兼容,并在很大程度上受到ARM64文件头的启发。因此,ARM64 3862306a36Sopenharmony_ci和RISC-V文件头可以在未来合并为一个共同的头。 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci注意 4162306a36Sopenharmony_ci==== 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci- 将来也可以复用这个文件头,用来对RISC-V的EFI桩提供支持。为了使内核镜像如同一个 4462306a36Sopenharmony_ci EFI应用程序一样加载,EFI规范中规定在内核镜像的开始需要PE/COFF镜像文件头。为了 4562306a36Sopenharmony_ci 支持EFI桩,应该用“MZ”魔术字符替换掉code0,并且res3(偏移量未0x3c)应指向PE/COFF 4662306a36Sopenharmony_ci 文件头的其余部分. 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci- 表示文件头版本号的Drop-bit位域 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci ========== ========== 5162306a36Sopenharmony_ci Bits 0:15 次要 版本 5262306a36Sopenharmony_ci Bits 16:31 主要 版本 5362306a36Sopenharmony_ci ========== ========== 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci 这保持了新旧版本之间的兼容性。 5662306a36Sopenharmony_ci 当前版本被定义为0.2。 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci- 从版本0.2开始,结构体成员“magic”就已经被弃用,在之后的版本中,可能会移除掉它。 5962306a36Sopenharmony_ci 最初,该成员应该与ARM64头的“magic”成员匹配,但遗憾的是并没有。 6062306a36Sopenharmony_ci “magic2”成员代替“magic”成员与ARM64头相匹配。 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci- 在当前的文件头,标志位域只剩下了一个位。 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci ===== ============================== 6562306a36Sopenharmony_ci Bit 0 内核字节序。1 if BE, 0 if LE. 6662306a36Sopenharmony_ci ===== ============================== 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci- 对于引导加载程序加载内核映像来说,image_size成员对引导加载程序而言是必须的,否 6962306a36Sopenharmony_ci 则将引导失败。 70