分享

Linux内核x86架构引导协议3(翻译)

 just_person 2012-04-19

数据头各字段的详细描述


       各字段的类型可以为:

读(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。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多