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 352