| |
| |
| NOTE that GRUB's own install functions can alter all of the significant |
| variables here... look in the install.html file for details. |
| |
| This file describes embedded variables in GRUB's stage1 and stage2 and |
| how they are meant to be used and manipulated. |
| |
| The primary reason for them being in well-defined locations is to allow |
| changes/installation/etc. without needing to recompile the modules, just |
| patch the binary directly. |
| |
| |
| "stage1" : |
| |
| NOTE: these are all defined in "stage1/stage1.S". |
| |
| -- at offset 0x1BC : "major version" |
| |
| This is the major version byte (should be a 1). |
| |
| -- at offset 0x1BD : "minor version" |
| |
| This is the minor version byte (should be a 0). |
| |
| -- at offset 0x1B8 : "stage2 start address" |
| |
| This is the data for the "ljmp" command to the starting address |
| of the component loaded by the stage1. The format is two 2-byte |
| words: the first is the IP, and the second is the CS segment |
| register (remember, we're in x86 real-mode... 16-bit instruction |
| pointer and segment registers shifted left by 4 bits). |
| |
| A "stage1.5" should be loaded at address 0x2000, and a "stage2" |
| should be loaded at address 0x8000. Both use a CS of 0. |
| |
| -- at offset 0x1B0 : "firstlist" |
| |
| This is the ending address of the blocklist data area. |
| |
| The trick here is that it is actually read backward, and the first |
| 8-byte blocklist is not read here, but after the pointer is |
| decremented 8 bytes, then after reading it, it decrements again, |
| reads, decrements, reads, etc. until it is finished. The |
| terminating condition is when the number of sectors to be read |
| in the next blocklist is 0. |
| |
| The format of a blocklist can be seen from the example in the |
| code just before the "firstlist" label. (note that it is |
| always from the beginning of the disk, and *NOT* relative to |
| the partition boundaries) |
| |
| -- at offset 0x1B0 : "loading drive" |
| |
| This is the BIOS drive number to load the blocklists from. |
| If the number is 0xFF, then load from the booting drive. |
| |
| |
| "stage1.5" and "stage2" (same structure) : |
| |
| NOTE: these are all defined at the beginning of "shared_src/asm.S". |
| |
| -- at offset 0x6 : "major version" |
| |
| This is the major version byte (should be a 1). |
| |
| -- at offset 0x7 : "minor version" |
| |
| This is the minor version byte (should be a 0). |
| |
| -- at offset 0x8 : "install_partition" |
| |
| This is an unsigned long representing the partition on the currently |
| booted disk which GRUB should expect to find it's data files and |
| treat as the default root partition. |
| |
| The format of is exactly the same as the "partition" part (the "disk" |
| part is ignored) of the data passed to an OS by a Multiboot-compliant |
| bootloader in the "boot_device" data element, with one exception. |
| |
| The exception is that if the first level of disk partitioning is |
| left as 0xFF (decimal 255, which is marked as no partitioning being |
| used), but the second level does have a partition number, it looks |
| for the first BSD-style PC partition, and finds the numbered BSD |
| sub-partition in it. The default "install_partition" 0xFF00FF, |
| would then find the first BSD-style PC partition, and use the "a" |
| partition in it, and 0xFF01FF would use the "b" partition, etc. |
| |
| If an explicit first-level partition is given, then no search is |
| performed, and it will expect that the BSD-style PC partition is |
| in the appropriate location, else a "no such partition" error will |
| be returned. |
| |
| IMPORTANT NOTE: If a "stage1.5" is being used, it will pass it's own |
| "install_partition" to any "stage2" it loads, therefore overwriting |
| the one present in the "stage2". |
| |
| -- at offset 0xC : "version_string" |
| |
| This is the "stage1.5" or "stage2" version string. It isn't |
| meant to be changed, simply easy to find. |
| |
| -- after the terminating zero of "version_string" : "config_file" |
| |
| This is the location, using the GRUB filesystem syntax, of the |
| config file. It will, by default, look in the "install_partition" |
| of the disk GRUB was loaded from, though one can use any valid |
| GRUB filesystem string, up to and including making it look on |
| other disks. |
| |
| IMPORTANT NOTE: The bootloader itself doesn't search for the end of |
| "version_string", it simply knows where "config_file" is, so the |
| beginning of the string cannot be moved after compile-time. This |
| should be OK, since the "version_string" is meant to be static. |
| |
| IMPORTANT NOTE #2: The code of stage2 starts again at offset 0x70, |
| so "config_file" string obviously can't go past there. Also, |
| remember to terminate the string with a 0. |