@Jester找到了我的问题并回答了这两个问题.解决方案实际上是在
file that I had linked,虽然我错过了相关部分.我在这里列出了相关内容供后人使用:
In 32-bit boot protocol,the first step in loading a Linux kernel
should be to setup the boot parameters (struct boot_params,
traditionally known as “zero page”). The memory for struct boot_params
should be allocated and initialized to all zero. Then the setup header
from offset 0x01f1 of kernel image on should be loaded into struct
boot_params and examined. The end of setup header can be calculated as
follow:
0x0202 + byte value at offset 0x0201
In addition to read/modify/write the setup header of the struct
boot_params as that of 16-bit boot protocol,the boot loader should
also fill the additional fields of the struct boot_params as that
described in zero-page.txt.
After setting up the struct boot_params,the boot loader can load the
32/64-bit kernel in the same way as that of 16-bit boot protocol.
In 32-bit boot protocol,the kernel is started by jumping to the
32-bit kernel entry point,which is the start address of loaded
32/64-bit kernel.
At entry,the CPU must be in 32-bit protected mode with paging
disabled; a GDT must be loaded with the descriptors for selectors
__BOOT_CS(0x10) and __BOOT_DS(0x18); both descriptors must be 4G flat segment; __BOOT_CS must have execute/read permission,and __BOOT_DS
must have read/write permission; CS must be __BOOT_CS and DS,ES,SS
must be __BOOT_DS; interrupt must be disabled; %esi must hold the base
address of the struct boot_params; %ebp,%edi and %ebx must be zero.
在同一文档中也可以找到64位指令.