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,表明了前两部分实模式下内核映像的代码。其他的值我们以后碰到了再去详细的分析它。