数据头各字段的详细描述各字段的类型可以为: 读(read): 内核提供给内核加载程序读取的字段。 写(write): 希望内核加载程序填充的字段 修改(modify): 希望内核加载程序读取后在修改的字段。 必须(obligatory): 内核加载程序必须写的字段。(如果想引导内核的话) 重定位(reloc): 如果想加载内核到非标准位置,需要填充的字段。否则,可以忽略这些字段。 所有字段都是littleendian类型的。(毕竟,这是x86)
字段名称: setup_sects 类型: 读 偏移/大小: 0x1f1/1 协议: ALL setup的大小。单位是扇区(每个扇区为512字节)。如果该字段未0,其真实值是4。内核的实模式部分是由引导扇区(总是512字节大小的一个扇区)和setup两部分构成的。
字段名称: root_flags 类型: 修改 (可选) 偏移/大小: 0x1f2/2 协议: ALL 如果该字段为非0值,根文件系统会以只读方式挂载。不推荐使用该字段。替代方案:在内核命令行参数中添加“ro”或者“rw”选项。
字段名称: syssize 类型: 读 偏移/大小: 0x1f4/4 (protocol 2.04+) 0x1f4/2 (protocol ALL) 协议: 2.04+ 保护模式部分的大小。单位是16个字节。2.04之前的版本中该字段的长度是两个字节,因此,如果LOAD_HIGH标志置位的话,在这些版本中,该字段无法正确的表示内核的大小。
字段名称: ram_size 类型: 内核内部使用 偏移/大小: 0x1f8/2 协议: ALL
该字段被废弃。
字段名称: vid_mode 类型: 修改 (obligatory) 偏移/大小: 0x1fa/2
请参考:需要特别留意的几个命令行选项
字段名称: root_dev 类型: 修改 (可选) 偏移/大小: 0x1fc/2 协议: ALL
默认根设备号。不推荐使用该字段。替代方案:在命令行中添加"root="选项。
字段名称: boot_flag 类型: 读 偏移/大小: 0x1fe/2 协议: ALL
Contains 0xAA55. This is the closest thing old Linux kernels have to a magic number.
字段名称: jump 类型: 读 偏移/大小: 0x200/2 协议: 2.00+
X86的跳转指令0xEB off, off 是相对于0x202的有符号偏移值。可以通过该字段得到数据头的大小。
字段名称: header 类型: 读 偏移/大小: 0x202/4 协议: 2.00+
setup的标志:"HdrS" (0x53726448).
字段名称: version 类型: 读 偏移/大小: 0x206/2 协议: 2.00+
引导协议的版本号。高8位是主版本号,低8为为子版本号。例如0x0204的含义就是2.04版,0x0a11的含义是10.17版(当然该版本现在并不存在)。
字段名称: realmode_swtch 类型: 修改 (可选) 偏移/大小: 0x208/4 协议: 2.00+
内核加载程序钩子 (见: 高级:内核加载程序钩子)
字段名称: start_sys_seg 类型: 读 偏移/大小: 0x20c/2 协议: 2.00+
The load low segment (0x1000). 已废弃.
字段名称: kernel_version 类型: read 偏移/大小: 0x20e/2 协议: 2.00+
如果该字段为非0值,那么,它就是一个人类可读的用来表示内核版本号的以Nul结尾的字符串。该字符串的长度小于0x200。该字符串可以用于显示给用户看。它的值应该小于0x200*setup_sects。 例如,该字段为0x1c00时,那么内核版本字符串的在内核文件中的偏移位置就应该是0x1e00。此时,setup_sects的值肯定大于等于15。因为,0x1c00 < 15*0x200 (= 0x1e00)而0x1c00 >= 14*0x200。 |
|