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 | |
---|