实模式汇编代码header.S——头变量hdr

3.2.2 初始化头变量hdr

在讲解“中世纪时代”的代码之前,先详细介绍一个在初始化当中非常重要的内容,hdr,全称叫做“setup_header”。这个头变量存放着所有初始化期间使用到的数据,在编译setup.bin的时候存放在.header段中,其代码我们看,从arch/x86/boot/header.S的第96行开始:

 

  94        .section ".header", "a"

  95        .globl  hdr

  96hdr:

  97setup_sects:    .byte 0                 /* Filled in by build.c */

  98root_flags:     .word ROOT_RDONLY

  99syssize:        .long 0                 /* Filled in by build.c */

 100ram_size:       .word 0                 /* Obsolete */

 101vid_mode:       .word SVGA_MODE

 102root_dev:       .word 0                 /* Filled in by build.c */

 103boot_flag:      .word 0xAA55

 104

 105        # offset 512, entry point

 106

 107        .globl  _start

 108_start:

112                .byte   0xeb          

 113                .byte   start_of_setup-1f

 1141:

118                .ascii  "HdrS"

 119                .word   0x020a

121                .globl realmode_swtch

 122realmode_swtch: .word   0, 0           

 123start_sys_seg:  .word   SYSSEG        

125                .word   kernel_version-512

130type_of_loader: .byte   0

136loadflags:

 137LOADED_HIGH     = 1   

 138CAN_USE_HEAP    = 0x80           

143                .byte   LOADED_HIGH

 145setup_move_size: .word  0x8000  

152code32_start: 

154                .long   0x100000   

 156ramdisk_image:  .long   0 

161ramdisk_size:   .long   0 

 163bootsect_kludge:

 164                .long   0     

166heap_end_ptr:   .word   _end+STACK_SIZE-512

172ext_loader_ver:

 173                .byte   0 

 174ext_loader_type:

 175                .byte   0 

 177cmd_line_ptr:   .long   0   

192ramdisk_max:    .long 0x7fffffff

200kernel_alignment:  .long CONFIG_PHYSICAL_ALIGN

203#ifdef CONFIG_RELOCATABLE

 204relocatable_kernel:    .byte 1

 205#else

 206relocatable_kernel:    .byte 0

 207#endif

 208min_alignment:       .byte   MIN_KERNEL_ALIGN_LG2

 209pad3:                   .word 0

 211cmdline_size:   .long   COMMAND_LINE_SIZE-1 

 215hardware_subarch:       .long 0        

 218hardware_subarch_data:  .quad 0

 220payload_offset:         .long ZO_input_data

 221payload_length:         .long ZO_z_input_len

 223setup_data:             .quad 0 

 

浩浩荡荡100多行的代码,去掉冗余的注释之后,就所剩无几了。不过,从注释的规模看了,这段代码实在是太重要了,这里只大概的介绍一下。上一节虽然说,内核本身的bootsect没有什么用处,不过hdr的起始位置确是在这个bootsect当中,从0x1f1处开始的。所以话又说回来了,这个bootsect并不是一无是处。

 

hdr位于数据段,其中部分内容在形成bzImage时,由arch/x86/boot/tools/build程序赋值,比如前面提到的setup_sects,表明了前两部分实模式下内核映像的代码。其他的值我们以后碰到了再去详细的分析它。

你可能感兴趣的:(汇编,image,command,header,input,alignment)