[e16e8f2] | 1 | chain.c32 documentation |
---|
| 2 | |
---|
| 3 | Although syslinux is capable of (very simple) native chainloading (through .bss |
---|
| 4 | and .bs options - see doc/syslinux.txt), it also features a very roboust and |
---|
| 5 | rich com32 module designed for such purpose. |
---|
| 6 | |
---|
| 7 | Chain module can perform few basic tasks: |
---|
| 8 | |
---|
| 9 | - load and jump to a sector |
---|
| 10 | - load and jump to a file (also loading a sector for other purposes) |
---|
| 11 | - prepare handover data to use by a file / boot sector |
---|
| 12 | - fix different options in a file / sector / partition entries |
---|
| 13 | - perform a "service-only" run |
---|
| 14 | |
---|
| 15 | It can chainload data from both GPT and DOS partitions, as well as boot the |
---|
| 16 | first sector from a raw disk. |
---|
| 17 | |
---|
| 18 | In more details, the rough overview of code is as follows: |
---|
| 19 | |
---|
| 20 | 1. Parse arguments. |
---|
| 21 | 2. Find drive and/or partition to boot from. |
---|
| 22 | 3. Perform partition-level patching - for example hiding, unhiding, fixing chs values, etc. |
---|
| 23 | 4. Load a file to boot from. |
---|
| 24 | 5. Load a sector to boot from, if it doesn't conflict with #5. |
---|
| 25 | 6. Prepare handover area, if it doesn't conflict with #5 & #6. |
---|
| 26 | 7. Prepare registers. |
---|
| 27 | 8. Patch loaded file if necessary. |
---|
| 28 | 9. Patch loaded sector if necessary. |
---|
| 29 | 10. Chainload. |
---|
| 30 | |
---|
| 31 | In most basic form, syslinux loads specified boot sector (or mbr, if not |
---|
| 32 | specified) at 0:0x7c00, prepares handover area as a standard mbr would do, and |
---|
| 33 | jumps to 0:0x7c00. |
---|
| 34 | |
---|
| 35 | A "service-only" run is possible when either: |
---|
| 36 | |
---|
| 37 | - 'break' is in effect |
---|
| 38 | |
---|
| 39 | or |
---|
| 40 | |
---|
| 41 | - 'nofile' and 'nomaps' (or 'nosect') are in effect |
---|
| 42 | |
---|
| 43 | This is useful for invocations such as: |
---|
| 44 | |
---|
| 45 | chain.c32 hdN M setbpb save break |
---|
| 46 | chain.c32 hdN fixchs break |
---|
| 47 | chain.c32 hdN unhideall break |
---|
| 48 | |
---|
| 49 | Please see respective options for more details. |
---|
| 50 | |
---|
| 51 | |
---|
| 52 | Module invocation: |
---|
| 53 | |
---|
| 54 | chain [drive/partition] [options] |
---|
| 55 | |
---|
| 56 | In case of repeated arguments, rightmost ones take precedence. |
---|
| 57 | |
---|
| 58 | |
---|
| 59 | DRIVE / PARTITION SPECIFICATION |
---|
| 60 | |
---|
| 61 | Drive can be specified as 'hd#', 'fd#', 'boot', 'mbr', or 'guid'. |
---|
| 62 | |
---|
| 63 | - 'mbr' will select a drive by its signature. |
---|
| 64 | - 'guid' will select a drive by its guid (GPT only). |
---|
| 65 | - 'boot' is the drive syslinux was booted from. This is the default value, if |
---|
| 66 | nothing else is specified. |
---|
| 67 | - 'hd#' and 'fd#' are standard ways to specify drive number as seen by bios, |
---|
| 68 | starting from 0. |
---|
| 69 | |
---|
| 70 | Option 'guid' is shared with partition selection (see below). If you happen |
---|
| 71 | to have non-unique guids, they are searched in disk0, partitions of disk0, |
---|
| 72 | disk1 ... order. |
---|
| 73 | |
---|
| 74 | 'mbr' and 'guid' take extra parameter - you should use ':' or '=' as a |
---|
| 75 | delimiter. |
---|
| 76 | |
---|
| 77 | Partition can be specified as '#', 'guid', 'label' or 'fs'. |
---|
| 78 | |
---|
| 79 | - 'guid' option will select a partition by a guid (not a type guid !) |
---|
| 80 | - 'label' will select a partition by a label (searching is done in |
---|
| 81 | disk order) |
---|
| 82 | - 'fs' will select a partition from which syslinux was executed |
---|
| 83 | - '#' is the standard method. Partitions 1-4 are primary, 5+ logical, 0 = boot |
---|
| 84 | MBR (default). |
---|
| 85 | |
---|
| 86 | If you use a number to select a partition it should be specified after a drive |
---|
| 87 | using space or comma as delimiters (after 'hd#', 'fd#', 'mbr', 'guid' or 'boot'). |
---|
| 88 | |
---|
| 89 | |
---|
| 90 | OPTIONS |
---|
| 91 | file=<file> |
---|
| 92 | *nofile |
---|
| 93 | |
---|
| 94 | It's often convenient to load a file directly and transfer control to it, |
---|
| 95 | instead of the sector from the disk. Note, that the <file> must reside on |
---|
| 96 | syslinux partition. |
---|
| 97 | |
---|
| 98 | If you choose this option without specifying any addresses explicitly (see |
---|
| 99 | options 'sect=' and 'seg='), the file will cause sector to not be loaded at all |
---|
| 100 | (as their memory placement would overlap). |
---|
| 101 | |
---|
| 102 | seg=<segment>:<offset>:<ip> |
---|
| 103 | *seg=0:0x7c00:0x7c00 |
---|
| 104 | |
---|
| 105 | This triplet lets you alter the addresses a file will use. It's loaded at |
---|
| 106 | <segment:offset>, the entry point is at <segment:ip>. When you chainload some |
---|
| 107 | other bootloader or kernel, it's almost always mandatory. |
---|
| 108 | |
---|
| 109 | The defaults, if option is not specified, are 0:0x7c00:0x7c00 |
---|
| 110 | If any of the fields are omitted (e.g. 0x2000::), they default to 0. |
---|
| 111 | |
---|
| 112 | sect=<segment>:<offset>:<ip> |
---|
| 113 | *sect=0:0x7c00:0x7c00 |
---|
| 114 | nosect |
---|
| 115 | nosect sets: nomaps |
---|
| 116 | |
---|
| 117 | This triplet lets you alter the addresses a sector will use. It's loaded at |
---|
| 118 | <segment:offset>, the entry point is at <segment:ip>. This option is mostly |
---|
| 119 | used in tandem with 'file=' and 'seg=' options, as some loaders/kernels will |
---|
| 120 | expect relocated sector at some particular address (e.g. DRKM). |
---|
| 121 | |
---|
| 122 | 'nosect' will cause sector to not be loaded at all. In plenty cases, when a file |
---|
| 123 | is being chainloaded, sector is not necessary. |
---|
| 124 | |
---|
| 125 | The defaults if option is not specified, are 0:0x7c00:0x7c00. |
---|
| 126 | If some of the fields are omitted (e.g. 0x2000::), they default to 0. |
---|
| 127 | |
---|
| 128 | *maps |
---|
| 129 | nomaps |
---|
| 130 | |
---|
| 131 | In some cases, it's useful to fix BPB values in NTFS/FATxx bootsectors and |
---|
| 132 | evntually write them back, but otherwise boot sector itself is not necessary to |
---|
| 133 | continue booting. 'nomaps' allows that - a sector will be loaded, but won't be |
---|
| 134 | mmapped into real memory. Any overlap tests (vs. handover or file areas) are |
---|
| 135 | not performed, being meaningless in such case. |
---|
| 136 | |
---|
| 137 | setbpb |
---|
| 138 | *nosetbpb |
---|
| 139 | |
---|
| 140 | Microsoft side of the world is paritculary sensitive to certain BPB values. |
---|
| 141 | Depending on the system and chainloading method (sector or file), some or all |
---|
| 142 | of those fields must match reality - and after e.g. drive clonning or |
---|
| 143 | when using usb stick in different computers - that is often not the case. |
---|
| 144 | |
---|
| 145 | The "reality" means: |
---|
| 146 | |
---|
| 147 | "hidden sectors" - valid offset of the partition from the beginning of the disk |
---|
| 148 | "geometry" - valid disk geometry as reported by BIOS |
---|
| 149 | "drive" - valid drive number |
---|
| 150 | |
---|
| 151 | This option will automatically determine the type of BPB and fix what is possible |
---|
| 152 | to fix, relatively to detected BPB. If it's impossible to detect BPB, function |
---|
| 153 | will do nothing. |
---|
| 154 | |
---|
| 155 | filebpb |
---|
| 156 | *nofilebpb |
---|
| 157 | |
---|
| 158 | Chainloaded file can simply be an image of a sector. In such case, it could be |
---|
| 159 | useful to also fix its BPB values. |
---|
| 160 | |
---|
| 161 | save |
---|
| 162 | *nosave |
---|
| 163 | save sets: strict=2 |
---|
| 164 | |
---|
| 165 | Fixing BPB values only in memory might not be enough. This option allows |
---|
| 166 | writing of the corrected sector. You will probably want to use this option |
---|
| 167 | together with 'setbpb'. |
---|
| 168 | |
---|
| 169 | - this option never applies to a loaded file |
---|
| 170 | - chain module will not save anything to disk by default (besides options such |
---|
| 171 | as hide or fixchs - so options related directly to partition entries) |
---|
| 172 | - writing is only performed, if the values actually changed |
---|
| 173 | |
---|
| 174 | *hand |
---|
| 175 | nohand |
---|
| 176 | |
---|
| 177 | By default, a handover area is always prepared if possible - meaning it doesn't |
---|
| 178 | overlap with other areas. It's often not necessary though - usually, a |
---|
| 179 | chainloaded file or kernel don't care about it anymore, so a user can disable |
---|
| 180 | it explicitly with this option. |
---|
| 181 | |
---|
| 182 | hptr |
---|
| 183 | *nohptr |
---|
| 184 | |
---|
| 185 | In case when both file and sector are loaded, ds:si and ds:bp will point to |
---|
| 186 | sector address before the chainloading. This option lets user force those |
---|
| 187 | registers to point to handover area. This is useful when both the file and the |
---|
| 188 | sector are actually a sector's image and the sector is mmapped. |
---|
| 189 | |
---|
| 190 | swap |
---|
| 191 | *noswap |
---|
| 192 | |
---|
| 193 | This option will install a tiny stub code used to swap drive numbers, if the |
---|
| 194 | drive we use during chainloading is not fd0 or hd0. |
---|
| 195 | |
---|
| 196 | hide[all] |
---|
| 197 | unhide[all] |
---|
| 198 | *nohide |
---|
| 199 | [un]hide[all] sets: strict=2 |
---|
| 200 | |
---|
| 201 | In certain situations it's useful to hide partitions - for example to make sure |
---|
| 202 | DOS gets C:. 'hide' will hide hidable primary partitions, except the one we're |
---|
| 203 | booting from. Similary, 'hideall' will hide all hidable partitions, except the |
---|
| 204 | one we're booting from. Hiding is performed only on the selected drive. Options |
---|
| 205 | starting with 'un' will simply unhide every partition (primary ones or all). |
---|
| 206 | Writing is only performed, if the os type values actually changed. |
---|
| 207 | |
---|
| 208 | fixchs |
---|
| 209 | *nofixchs |
---|
| 210 | fixchs sets: strict=2 |
---|
| 211 | |
---|
| 212 | If you want to make a drive you're booting from totally compatible with current |
---|
| 213 | BIOS, you can use this to fix all partitions' CHS numbers. Good to silence e.g. |
---|
| 214 | FreeDOS complainig about 'logical CHS differs from physical' of sfdisk about |
---|
| 215 | 'found (...) expected (...). Functionally seems to be mostly cosmetic, as |
---|
| 216 | Microsoft world - in cases it cares about geometry - generally sticks to values |
---|
| 217 | written in bootsectors. And the rest of the world generally doesn't care about |
---|
| 218 | them at all. Writing is only performed, if the values actually got changed. |
---|
| 219 | |
---|
| 220 | keepexe |
---|
| 221 | *nokeepexe |
---|
| 222 | |
---|
| 223 | If you're booting over a network using pxelinux - this lets you keep UNDI |
---|
| 224 | stacks in memory (pxelinux only). |
---|
| 225 | |
---|
| 226 | warn |
---|
| 227 | *nowarn |
---|
| 228 | |
---|
| 229 | This option will wait for a keypress right before continuing the chainloading. |
---|
| 230 | Useful to see warnings emited by the chain module. |
---|
| 231 | |
---|
| 232 | prefmbr |
---|
| 233 | *noprefmbr |
---|
| 234 | |
---|
| 235 | In the case of presence of non-standard hybrid MBR/GPT layout, this flag makes |
---|
| 236 | chain module prefer MBR layout over GPT. |
---|
| 237 | |
---|
| 238 | strict[=<0|1|2>] |
---|
| 239 | *strict=1 |
---|
| 240 | relax |
---|
| 241 | |
---|
| 242 | Those options control the level of sanity checks used during the traversal of |
---|
| 243 | partition table(s). This is useful in buggy corner cases, when the disk size is |
---|
| 244 | reported differently across different computers or virtual machines (if it |
---|
| 245 | happens at all, the size usually differs by 1 sector). Normally the partition |
---|
| 246 | iterator would report an error and abort in such case. Another case scenario is |
---|
| 247 | disk corruption in some later EMBR partition. |
---|
| 248 | |
---|
| 249 | - strict=0 inhibits any checks |
---|
| 250 | - strict=1 enables checks, but ignores those that involve disk size |
---|
| 251 | - strict=2 enables all checks |
---|
| 252 | - relax and nostrict are equivalent to strict=0 |
---|
| 253 | - norelax and strict are equivalent to strict=2 |
---|
| 254 | |
---|
| 255 | |
---|
| 256 | break |
---|
| 257 | *nobreak |
---|
| 258 | break sets: nofile nomaps nohand |
---|
| 259 | |
---|
| 260 | It is possible to trigger a "service-only" run - The chain module will do |
---|
| 261 | everything requested as usual, but it will not perform the actual chainloading. |
---|
| 262 | 'break' option disables handover, file loading and sector mapping, as these |
---|
| 263 | are pointless in such scenario (although file might be reenabled in some future |
---|
| 264 | version, if writing to actual files becomes possible). Mainly useful for |
---|
| 265 | options 'fixchs', '[un]hide[all]' and setbpb. |
---|
| 266 | |
---|
| 267 | isolinux=<file> |
---|
| 268 | sets: file=<file> nohand nosect isolinux |
---|
| 269 | |
---|
| 270 | Chainload another version/build of the ISOLINUX bootloader and patch the loader |
---|
| 271 | with appropriate parameters in memory. This avoids the need for the |
---|
| 272 | -eltorito-alt-boot parameter of mkisofs, when you want more than one ISOLINUX |
---|
| 273 | per CD/DVD. |
---|
| 274 | |
---|
| 275 | ntldr=<file> |
---|
| 276 | sets: file=<file> seg=0x2000 setbpb nohand |
---|
| 277 | |
---|
| 278 | Prepares to load ntldr directly. You might want to add 'save' option to store |
---|
| 279 | corrected BPB values. |
---|
| 280 | |
---|
| 281 | cmldr=<file> |
---|
| 282 | sets: file=<file> seg=0x2000 setbpb nohand cmldr |
---|
| 283 | |
---|
| 284 | Prepares to load recovery console directly. In-memory copy of bootsector is |
---|
| 285 | patched with "cmdcons\0". Remarks the same as in 'ntldr='. |
---|
| 286 | |
---|
| 287 | reactos=<file> |
---|
| 288 | sets: file=<file> seg=0:0x8000:0x8100 setbpb nohand |
---|
| 289 | |
---|
| 290 | Prepares to load ReactOS's freeldr directly. You might want to add 'save' |
---|
| 291 | option to store corrected BPB values. |
---|
| 292 | |
---|
| 293 | freedos=<file> |
---|
| 294 | sets: file=<file> seg=0x60 sect=0x1FE0 setbpb nohand |
---|
| 295 | |
---|
| 296 | Prepares to load freedos kernel directly. You will likely want to add 'save' |
---|
| 297 | option, as those kernels seem to require proper geometry written back to disk. |
---|
| 298 | Sector address is chosen based on where freedos' bootsectors relocate themselves, |
---|
| 299 | although it seems the kernel doesn't rely on it. |
---|
| 300 | |
---|
| 301 | You might also want to employ 'hide' option, if you have problems with properly |
---|
| 302 | assigned C: drive. |
---|
| 303 | |
---|
| 304 | pcdos=<file> |
---|
| 305 | msdos=<file> |
---|
| 306 | sets: file=<file> seg=0x70 sect=0x8000 setbpb nohand |
---|
| 307 | |
---|
| 308 | Similary to 'freedos=', This prepares to load MSDOS 2.00 - 6.xx or derivatives. |
---|
| 309 | Sector address is chosen arbitrarily. Otherwise comments as above. |
---|
| 310 | |
---|
| 311 | msdos7=<file> |
---|
| 312 | sets: file=<file> seg=0x70::0x200 sect=0x8000 setbpb nohand |
---|
| 313 | |
---|
| 314 | Only for MSDOS 7+ versions (98se ~ 7.xx, Me ~ 8.xx). Comments as above. |
---|
| 315 | TODO/TEST |
---|
| 316 | |
---|
| 317 | drmk=<file> |
---|
| 318 | sets: file=<file> seg=0x70 sect=0x2000:0:0 setbpb nohand |
---|
| 319 | |
---|
| 320 | This is used for loading of *only* Dell's DOS derivatives. It does require boot |
---|
| 321 | sector at 0x2000 and overall valid BPB values. As in other DOS-ish cases, |
---|
| 322 | likely candidates for use are 'save' and 'hide'. |
---|
| 323 | |
---|
| 324 | grub=<file> [grubcfg=<config>] |
---|
| 325 | sets: file=<file> seg=0x800::0x200 nohand nosect grub |
---|
| 326 | |
---|
| 327 | Chainloads grub legacy's stage2, performing additional corrections on the file |
---|
| 328 | in memory. Additionally, alternate config file can be specified through |
---|
| 329 | 'grubcfg=' option |
---|
| 330 | |
---|
| 331 | grldr=<file> |
---|
| 332 | sets: file=<file> nohand nosect grldr |
---|
| 333 | |
---|
| 334 | Chainloads GRUB4DOS grldr, performing additional corrections on the file |
---|
| 335 | in memory. |
---|
| 336 | |
---|
| 337 | bss=<file> |
---|
| 338 | sets: file=<file> nomaps setbpb bss |
---|
| 339 | |
---|
| 340 | This emulates syslinux's native BSS option. This loads both the file and the |
---|
| 341 | sector, adjusts BPB values in the loaded sector, then copies all possible BPB |
---|
| 342 | fields to the loaded file. Everything is made with reference to the selected |
---|
| 343 | disk/partition. |
---|
| 344 | |
---|
| 345 | bs=<file> |
---|
| 346 | sets: file=<file> nosect filebpb |
---|
| 347 | |
---|
| 348 | This emulates syslinux's native BS option. This loads the file and if possible |
---|
| 349 | - adjusts its BPB values. Everything is made with reference to the selected |
---|
| 350 | disk/partition. |
---|
| 351 | |
---|