1*d619afd3SYanteng Si.. include:: ../disclaimer-zh_CN.rst 2*d619afd3SYanteng Si 3*d619afd3SYanteng Si:Original: :doc:`../../../riscv/boot-image-header` 4*d619afd3SYanteng Si:Translator: Yanteng Si <siyanteng@loongson.cn> 5*d619afd3SYanteng Si 6*d619afd3SYanteng Si.. _cn_boot-image-header.rst: 7*d619afd3SYanteng Si 8*d619afd3SYanteng Si 9*d619afd3SYanteng Si========================== 10*d619afd3SYanteng SiRISC-V Linux启动镜像文件头 11*d619afd3SYanteng Si========================== 12*d619afd3SYanteng Si 13*d619afd3SYanteng Si:Author: Atish Patra <atish.patra@wdc.com> 14*d619afd3SYanteng Si:Date: 20 May 2019 15*d619afd3SYanteng Si 16*d619afd3SYanteng Si此文档仅描述RISC-V Linux 启动文件头的详情。 17*d619afd3SYanteng Si 18*d619afd3SYanteng SiTODO: 19*d619afd3SYanteng Si 写一个完整的启动指南。 20*d619afd3SYanteng Si 21*d619afd3SYanteng Si在解压后的Linux内核镜像中存在以下64字节的文件头:: 22*d619afd3SYanteng Si 23*d619afd3SYanteng Si u32 code0; /* Executable code */ 24*d619afd3SYanteng Si u32 code1; /* Executable code */ 25*d619afd3SYanteng Si u64 text_offset; /* Image load offset, little endian */ 26*d619afd3SYanteng Si u64 image_size; /* Effective Image size, little endian */ 27*d619afd3SYanteng Si u64 flags; /* kernel flags, little endian */ 28*d619afd3SYanteng Si u32 version; /* Version of this header */ 29*d619afd3SYanteng Si u32 res1 = 0; /* Reserved */ 30*d619afd3SYanteng Si u64 res2 = 0; /* Reserved */ 31*d619afd3SYanteng Si u64 magic = 0x5643534952; /* Magic number, little endian, "RISCV" */ 32*d619afd3SYanteng Si u32 magic2 = 0x05435352; /* Magic number 2, little endian, "RSC\x05" */ 33*d619afd3SYanteng Si u32 res3; /* Reserved for PE COFF offset */ 34*d619afd3SYanteng Si 35*d619afd3SYanteng Si这种头格式与PE/COFF文件头兼容,并在很大程度上受到ARM64文件头的启发。因此,ARM64 36*d619afd3SYanteng Si和RISC-V文件头可以在未来合并为一个共同的头。 37*d619afd3SYanteng Si 38*d619afd3SYanteng Si注意 39*d619afd3SYanteng Si==== 40*d619afd3SYanteng Si 41*d619afd3SYanteng Si- 将来也可以复用这个文件头,用来对RISC-V的EFI桩提供支持。为了使内核镜像如同一个 42*d619afd3SYanteng Si EFI应用程序一样加载,EFI规范中规定在内核镜像的开始需要PE/COFF镜像文件头。为了 43*d619afd3SYanteng Si 支持EFI桩,应该用“MZ”魔术字符替换掉code0,并且res3(偏移量未0x3c)应指向PE/COFF 44*d619afd3SYanteng Si 文件头的其余部分. 45*d619afd3SYanteng Si 46*d619afd3SYanteng Si- 表示文件头版本号的Drop-bit位域 47*d619afd3SYanteng Si 48*d619afd3SYanteng Si ========== ========== 49*d619afd3SYanteng Si Bits 0:15 次要 版本 50*d619afd3SYanteng Si Bits 16:31 主要 版本 51*d619afd3SYanteng Si ========== ========== 52*d619afd3SYanteng Si 53*d619afd3SYanteng Si 这保持了新旧版本之间的兼容性。 54*d619afd3SYanteng Si 当前版本被定义为0.2。 55*d619afd3SYanteng Si 56*d619afd3SYanteng Si- 从版本0.2开始,结构体成员“magic”就已经被弃用,在之后的版本中,可能会移除掉它。 57*d619afd3SYanteng Si 最初,该成员应该与ARM64头的“magic”成员匹配,但遗憾的是并没有。 58*d619afd3SYanteng Si “magic2”成员代替“magic”成员与ARM64头相匹配。 59*d619afd3SYanteng Si 60*d619afd3SYanteng Si- 在当前的文件头,标志位域只剩下了一个位。 61*d619afd3SYanteng Si 62*d619afd3SYanteng Si ===== ============================== 63*d619afd3SYanteng Si Bit 0 内核字节序。1 if BE, 0 if LE. 64*d619afd3SYanteng Si ===== ============================== 65*d619afd3SYanteng Si 66*d619afd3SYanteng Si- 对于引导加载程序加载内核映像来说,image_size成员对引导加载程序而言是必须的,否 67*d619afd3SYanteng Si 则将引导失败。 68