Summary of empty_zero_page layout (kernel point of view)
     ( collected by Hans Lermen and Martin Mares )
 
The contents of empty_zero_page are used to pass parameters from the
16-bit realmode code of the kernel to the 32-bit part. References/settings
to it mainly are in:

  arch/i386/boot/setup.S
  arch/i386/boot/video.S
  arch/i386/kernel/head.S
  arch/i386/kernel/setup.c
 

Offset	Type		Description
------  ----		-----------
    0	32 bytes	struct screen_info, SCREEN_INFO
			ATTENTION, overlaps the following !!!
    2	unsigned short	EXT_MEM_K, extended memory size in Kb (from int 0x15)
 0x20	unsigned short	CL_MAGIC, commandline magic number (=0xA33F)
 0x22	unsigned short	CL_OFFSET, commandline offset
			Address of commandline is calculated:
			  0x90000 + contents of CL_OFFSET
			(only taken, when CL_MAGIC = 0xA33F)
 0x40	20 bytes	struct apm_bios_info, APM_BIOS_INFO
 0x80	16 bytes	hd0-disk-parameter from intvector 0x41
 0x90	16 bytes	hd1-disk-parameter from intvector 0x46

 0xa0	16 bytes	System description table truncated to 16 bytes.
			( struct sys_desc_table_struct )
 0xb0 - 0x1df		Free. Add more parameters here if you really need them.

0x1e0	unsigned long	ALT_MEM_K, alternative mem check, in Kb
0x1e8	char		number of entries in E820MAP (below)
0x1e9	unsigned char	number of entries in EDDBUF (below)
0x1f1	char		size of setup.S, number of sectors
0x1f2	unsigned short	MOUNT_ROOT_RDONLY (if !=0)
0x1f4	unsigned short	size of compressed kernel-part in the
			(b)zImage-file (in 16 byte units, rounded up)
0x1f6	unsigned short	swap_dev (unused AFAIK)
0x1f8	unsigned short	RAMDISK_FLAGS
0x1fa	unsigned short	VGA-Mode (old one)
0x1fc	unsigned short	ORIG_ROOT_DEV (high=Major, low=minor)
0x1ff	char		AUX_DEVICE_INFO

0x200	short jump to start of setup code aka "reserved" field.
0x202	4 bytes		Signature for SETUP-header, ="HdrS"
0x206	unsigned short	Version number of header format
			Current version is 0x0201...
0x208	8 bytes		(used by setup.S for communication with boot loaders,
			 look there)
0x210	char		LOADER_TYPE, = 0, old one
			else it is set by the loader:
			0xTV: T=0 for LILO
				1 for Loadlin
				2 for bootsect-loader
				3 for SYSLINUX
				4 for ETHERBOOT
				V = version
0x211	char		loadflags:
			bit0 = 1: kernel is loaded high (bzImage)
			bit7 = 1: Heap and pointer (see below) set by boot
				  loader.
0x212	unsigned short	(setup.S)
0x214	unsigned long	KERNEL_START, where the loader started the kernel
0x218	unsigned long	INITRD_START, address of loaded ramdisk image
0x21c	unsigned long	INITRD_SIZE, size in bytes of ramdisk image
0x220	4 bytes		(setup.S)
0x224	unsigned short	setup.S heap end pointer
0x228	4 bytes		unknown, but writing this in setup.S makes
			kernel fail to decompress on some systems
0x2cc	4 bytes		DISK80_SIG_BUFFER (setup.S)
0x2d0 - 0x600		E820MAP
0x600 - 0x7ff		EDDBUF (setup.S) for disk signature read sector
0x600 - 0x7de		EDDBUF (setup.S)

0x800	string, 2K max	COMMAND_LINE, the kernel commandline as
			copied using CL_OFFSET.
			Note: this will be copied once more by setup.c
			into a local buffer which is only 256 bytes long.
			( #define COMMAND_LINE_SIZE 256 )
