Image校验和
From boot protocol version 2.08 onwards the CRC-32 is calculated over
the entire file using the characteristic polynomial 0x04C11DB7 and an
initial remainder of 0xffffffff. The checksum is appended to the
file; therefore the CRC of the file up to the limit specified in the
syssize field of the header is always 0.
内核命令行
内核命令行是内核加载程序向内核通信的重要途径。有些参数对于内核加载程序自己要很重要。参照“需要特别留意的几个命令行选项”。
内核命令行是一个以0结尾的字符串。最大长度是cmdline_size。在2.06之前版本的引导协议中,最大长度是255个字符。如果字符串过大,会被内核自动截断。
如果是2.02及之后的版本,命令行参数的地址由数据头中cmd_line_ptr指出。这个地址可以是从setup的堆末尾到0xA0000之间的任意位置。如果是2.02及其以前版本必须遵循以下协议:
在偏移0x0020处为cmd_line_magic,内容必须是0xA33F。大小是2个字节
在偏移0x0022处为cmd_line_offset,内容是命令行参数相对于内核实模式部分代码的偏移位置。大小是2个字节。
另外,内核命令行参数必须在setup_move_size所指定的内存区域内。因此,你可能需要修改setup_move_size的值以满足该要求。
实模式部分的内存布局
内核的实模式部分要求设置堆栈地址,并在最好也设置内核命令行参数。它们都需要在低于1MB的实模式下可以访问的地方。
需要留意的是现在的机器中存在一个相当大的名为Extended BIOS Data Area (EBDA)区域。所以,如果可能使用的内存地址越小越好(因为EBDA会放置在常规内存的顶部)。
不幸的是,在以下情况下,必须将内核加载到0x90000处:
当加载zImage类型的内核并且满足条件 ((loadflags & 0x01) == 0)时。
当加载2.01及更早版本的内核时。
在2.00和2.01版的引导协议中,实模式部分可以被加载到其他地方,但是,内核会将自己在重新移动到0x90000。在“老版”的引导协议中,实模式部分必须加载到0x90000处。
当内核被加载到0x90000时,尽量不要使用0x9a000以上的内存。
在2.02及更高版本的协议中,命令行参数不需要和实模式下的setup在同一个64K段。这样就让堆栈可以有整个64K段大。然后,内核命令行参数在这之上。
内核命令行参数不应该位于内核实模式部分的底下,也不应该再高位内存中。
联系客服