|
@@ -1054,6 +1054,44 @@ 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-bit BOOT PROTOCOL
|
|
|
+
|
|
|
+For machine with 64bit cpus and 64bit kernel, we could use 64bit bootloader
|
|
|
+and we need a 64-bit boot protocol.
|
|
|
+
|
|
|
+In 64-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
|
|
|
+could be allocated anywhere (even above 4G) and initialized to all zero.
|
|
|
+Then, the setup header at offset 0x01f1 of kernel image on should be
|
|
|
+loaded into struct boot_params and examined. The end of setup header
|
|
|
+can be calculated as follows:
|
|
|
+
|
|
|
+ 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 described
|
|
|
+in zero-page.txt.
|
|
|
+
|
|
|
+After setting up the struct boot_params, the boot loader can load
|
|
|
+64-bit kernel in the same way as that of 16-bit boot protocol, but
|
|
|
+kernel could be loaded above 4G.
|
|
|
+
|
|
|
+In 64-bit boot protocol, the kernel is started by jumping to the
|
|
|
+64-bit kernel entry point, which is the start address of loaded
|
|
|
+64-bit kernel plus 0x200.
|
|
|
+
|
|
|
+At entry, the CPU must be in 64-bit mode with paging enabled.
|
|
|
+The range with setup_header.init_size from start address of loaded
|
|
|
+kernel and zero page and command line buffer get ident mapping;
|
|
|
+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; %rsi must hold the base
|
|
|
+address of the struct boot_params.
|
|
|
+
|
|
|
**** EFI HANDOVER PROTOCOL
|
|
|
|
|
|
This protocol allows boot loaders to defer initialisation to the EFI
|