1[This documentation is rather crufty at the moment.] 2 3MEMDISK is meant to allow booting legacy operating systems via PXE, 4and as a workaround for BIOSes where ISOLINUX image support doesn't 5work. 6 7MEMDISK simulates a disk by claiming a chunk of high memory for the 8disk and a (very small - 2K typical) chunk of low (DOS) memory for the 9driver itself, then hooking the INT 13h (disk driver) and INT 15h 10(memory query) BIOS interrupts. 11 12MEMDISK allows for an OS to detect the MEMDISK instance. (See the 13"Additional technical information" section below.) 14 15To use it, type on the Syslinux command line: 16 17memdisk initrd=diskimg.img 18 19... where diskimg.img is the disk image you want to boot from. 20 21[Obviously, the memdisk binary as well as your disk image file need to 22be present in the boot image directory.] 23 24... or add to your syslinux.cfg/pxelinux.cfg/isolinux.cfg something like: 25 26label dos 27 kernel memdisk 28 append initrd=dosboot.img 29 30Note the following: 31 32a) The disk image can be uncompressed or compressed with gzip or zip. 33 34b) If the disk image is less than 4,194,304 bytes (4096K, 4 MB) it is 35 assumed to be a floppy image and MEMDISK will try to guess its 36 geometry based on the size of the file. MEMDISK recognizes all the 37 standard floppy sizes as well as common extended formats: 38 39 163,840 bytes (160K) c=40 h=1 s=8 5.25" SSSD 40 184,320 bytes (180K) c=40 h=1 s=9 5.25" SSSD 41 327,680 bytes (320K) c=40 h=2 s=8 5.25" DSDD 42 368,640 bytes (360K) c=40 h=2 s=9 5.25" DSDD 43 655,360 bytes (640K) c=80 h=2 s=8 3.5" DSDD 44 737,280 bytes (720K) c=80 h=2 s=9 3.5" DSDD 45 1,222,800 bytes (1200K) c=80 h=2 s=15 5.25" DSHD 46 1,474,560 bytes (1440K) c=80 h=2 s=18 3.5" DSHD 47 1,638,400 bytes (1600K) c=80 h=2 s=20 3.5" DSHD (extended) 48 1,720,320 bytes (1680K) c=80 h=2 s=21 3.5" DSHD (extended) 49 1,763,328 bytes (1722K) c=82 h=2 s=21 3.5" DSHD (extended) 50 1,784,832 bytes (1743K) c=83 h=2 s=21 3.5" DSHD (extended) 51 1,802,240 bytes (1760K) c=80 h=2 s=22 3.5" DSHD (extended) 52 1,884,160 bytes (1840K) c=80 h=2 s=23 3.5" DSHD (extended) 53 1,966,080 bytes (1920K) c=80 h=2 s=24 3.5" DSHD (extended) 54 2,949,120 bytes (2880K) c=80 h=2 s=36 3.5" DSED 55 3,194,880 bytes (3120K) c=80 h=2 s=39 3.5" DSED (extended) 56 3,276,800 bytes (3200K) c=80 h=2 s=40 3.5" DSED (extended) 57 3,604,480 bytes (3520K) c=80 h=2 s=44 3.5" DSED (extended) 58 3,932,160 bytes (3840K) c=80 h=2 s=48 3.5" DSED (extended) 59 60 A small perl script is included in the MEMDISK directory which can 61 determine the geometry that MEMDISK would select for other sizes; 62 in general MEMDISK will correctly detect most physical extended 63 formats used, with 80 cylinders or slightly more. 64 65 If the image is 4 MB or larger, it is assumed to be a hard disk 66 image, and should typically have an MBR and a partition table. It 67 may optionally have a DOSEMU geometry header; in which case the 68 header is used to determine the C/H/S geometry of the disk. 69 Otherwise, the geometry is determined by examining the partition 70 table, so the entire image should be partitioned for proper 71 operation (it may be divided between multiple partitions, however.) 72 73 You can also specify the geometry manually with the following command 74 line options: 75 76 c=# Specify number of cylinders (max 1024[*]) 77 h=# Specify number of heads (max 256[*]) 78 s=# Specify number of sectors (max 63) 79 floppy[=#] The image is a floppy image[**] 80 harddisk[=#] The image is a hard disk image[**] 81 iso The image is an El Torito ISO9660 image (drive 0xE0) 82 83 # represents a decimal number. 84 85 [*] MS-DOS only allows max 255 heads, and only allows 255 cylinders 86 on floppy disks. 87 88 [**] Normally MEMDISK emulates the first floppy or hard disk. This 89 can be overridden by specifying an index, e.g. floppy=1 will 90 simulate fd1 (B:). This may not work on all operating systems 91 or BIOSes. 92 93c) The disk is normally writable (although, of course, there is 94 nothing backing it up, so it only lasts until reset.) If you want, 95 you can mimic a write-protected disk by specifying the command line 96 option: 97 98 ro Disk is readonly 99 100d) MEMDISK normally uses the BIOS "INT 15h mover" API to access high 101 memory. This is well-behaved with extended memory managers which load 102 later. Unfortunately it appears that the "DOS boot disk" from 103 WinME/XP *deliberately* crash the system when this API is invoked. 104 The following command-line options tells MEMDISK to enter protected 105 mode directly, whenever possible: 106 107 raw Use raw access to protected mode memory. 108 109 bigraw Use raw access to protected mode memory, and leave the 110 CPU in "big real" mode afterwards. 111 112 int Use plain INT 15h access to protected memory. This assumes 113 that anything which hooks INT 15h knows what it is doing. 114 115 safeint Use INT 15h access to protected memory, but invoke 116 INT 15h the way it was *before* MEMDISK was loaded. 117 This is the default since version 3.73. 118 119e) MEMDISK by default supports EDD/EBIOS on hard disks, but not on 120 floppy disks. This can be controlled with the options: 121 122 edd Enable EDD/EBIOS 123 noedd Disable EDD/EBIOS 124 125f) The following option can be used to pause to view the messages: 126 127 pause Wait for a keypress right before booting 128 129g) The following option can be used to set the real-mode stack size. 130 The default is 512 bytes, but if there is a failure it might be 131 interesting to set it to something larger: 132 133 stack=size Set the stack to "size" bytes 134 135h) Some systems without a floppy drive have been known to have 136 problems with floppy images. To avoid that those problems, first 137 of all make sure you don't have a floppy drive configured on the 138 BIOS screen. If there is no option to configure that, or that 139 doesn't work, you can use the option: 140 141 nopass Hide all real drives of the same type (floppy or hard disk) 142 nopassany Hide all real drives (floppy and hard disk) 143 144i) The following standard Linux option will mark memory as reserved. 145 Please note that the Syslinux core already loads MEMDISK and its 146 initrd below this point: 147 148 mem=size Mark available memory above this point as Reserved. 149 150 151Some interesting things to note: 152 153If you're using MEMDISK to boot DOS from a CD-ROM (using ISOLINUX), 154you might find the generic El Torito CD-ROM driver by Gary Tong and 155Bart Lagerweij useful. It is now included with the Syslinux 156distribution, in the dosutil directory. See the file 157dosutil/eltorito.txt for more information. 158 159Similarly, if you're booting DOS over the network using PXELINUX, you 160can use the "keeppxe" option and use the generic PXE (UNDI) NDIS 161network driver, which is part of the PROBOOT.EXE distribution from 162Intel: 163 164 http://www.intel.com/support/network/adapter/1000/software.htm 165 166 167Additional technical information: 168 169Starting with version 2.08, MEMDISK now supports an installation check 170API. This works as follows: 171 172 EAX = 454D08xxh ("ME") (08h = parameter query) 173 ECX = 444Dxxxxh ("MD") 174 EDX = 5349xxnnh ("IS") (nn = drive #) 175 EBX = 3F4Bxxxxh ("K?") 176 INT 13h 177 178If drive nn is a MEMDISK, the registers will contain: 179 180 EAX = 4D21xxxxh ("!M") 181 ECX = 4D45xxxxh ("EM") 182 EDX = 4944xxxxh ("DI") 183 EBX = 4B53xxxxh ("SK") 184 185 ES:DI -> MEMDISK info structures 186 187The low parts of EAX/ECX/EDX/EBX have the normal return values for INT 18813h, AH=08h, i.e. information of the disk geometry etc. 189 190See Ralf Brown's interrupt list, 191http://www.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/WWW/files.html or 192http://www.ctyme.com/rbrown.htm, for a detailed description. 193 194The MEMDISK info structure currently contains: 195 196 [ES:DI] word Total size of structure (currently 30 bytes) 197 [ES:DI+2] byte MEMDISK minor version 198 [ES:DI+3] byte MEMDISK major version 199 [ES:DI+4] dword Pointer to MEMDISK data in high memory 200 [ES:DI+8] dword Size of MEMDISK data in sectors 201 [ES:DI+12] 16:16 Far pointer to command line 202 [ES:DI+16] 16:16 Old INT 13h pointer 203 [ES:DI+20] 16:16 Old INT 15h pointer 204 [ES:DI+24] word Amount of DOS memory before MEMDISK loaded 205 [ES:DI+26] byte Boot loader ID 206 [ES:DI+27] byte Sector size as a power of 2 207 (If zero, assume 512-byte sectors) 208 [ES:DI+28] word If nonzero, offset (vs ES) to installed DPT 209 This pointer+16 contains the original INT 1Eh 210 211Sizes of this structure: 212 2133.71+ 30 bytes Added DPT pointer 2143.00-3.70 27 bytes Added boot loader ID 215pre-3.00 26 bytes 216 217In addition, the following fields are available at [ES:0]: 218 219 [ES:0] word Offset of INT 13h routine (segment == ES) 220 [ES:2] word Offset of INT 15h routine (segment == ES) 221 222The program mdiskchk.c in the sample directory is an example on how 223this API can be used. 224 225The following code can be used to "disable" MEMDISK. Note that it 226does not free the handler in DOS memory, and that running this from 227DOS will probably crash your machine (DOS doesn't like drives suddenly 228disappearing from underneath.) This is also not necessarily the best 229method for this. 230 231 mov eax, 454D0800h 232 mov ecx, 444D0000h 233 mov edx, 53490000h 234 mov dl,drive_number 235 mov ebx, 3F4B0000h 236 int 13h 237 238 shr eax, 16 239 cmp ax, 4D21h 240 jne not_memdisk 241 shr ecx, 16 242 cmp cx, 4D45h 243 jne not_memdisk 244 shr edx, 16 245 cmp dx, 4944h 246 jne not_memdisk 247 shr ebx, 16 248 cmp bx, 4B53h 249 jne not_memdisk 250 251 cli 252 mov bx,[es:0] ; INT 13h handler offset 253 mov eax,[es:di+16] ; Old INT 13h handler 254 mov byte [es:bx], 0EAh ; FAR JMP 255 mov [es:bx+1], eax 256 257 mov bx,[es:2] ; INT 15h handler offset 258 mov eax,[es:di+20] ; Old INT 15h handler 259 mov byte [es:bx], 0EAh ; FAR JMP 260 mov [es:bx+1], eax 261 sti 262 263MEMDISK supports the Win9x "safe hook" structure for OS detection. 264(See "Safe Master Boot Record INT 13h Hook Routines," available at 265http://www.osronline.com/ddkx/w98ddk/storage_5l6g.htm as of 266December 7th, 2009.) An OS driver can take a look at the INTerrupt table 267and try to walk along the chain of those hooks that implement the "safe hook" 268structure. For each hook discovered, a vendor can be identified and the OS 269driver can take appropriate action. The OS driver can mark the "flags" field 270of the "safe hook" to indicate that the driver has reviewed it already. This 271prevents accidental re-detection, for example. 272 273MEMDISK adds one additional extension field to the "safe hook" structure, a 274pointer to a special MEMDISK structure called the "mBFT." The mBFT is the 275"MEMDISK Boot Firmware Table" (akin to the iSCSI iBFT and the AoE aBFT). An 276OS driver looking at MEMDISK's "safe hook" should know that this field will 277be present based on the fact that MEMDISK is the vendor identifier. 278 279The mBFT is little more than an ACPI table to prefix MEMDISK's traditional 280MEMDISK info structure (the "MDI"). The ACPI table's details are: 281 282 OEM ID. . . .: MEMDSK 283 OEM Table ID : Syslinux 284 285There is a 1-byte checksum field which covers the length of the mBFT all 286the way through to the end of the MEMDISK info structure. 287 288There is also a physical pointer to the "safe hook" structure associated 289with the MEMDISK instance. An OS driver might use the following logic: 290 291 1. Walk INT 13h "safe hook" chain as far as possible, marking hooks as 292 having been reviewed. For MEMDISK hooks, the driver then follows the 293 pointer to the mBFT and gathers the RAM disk details from the included 294 MDI. 295 2. The OS driver scans low memory for valid mBFTs. MEMDISK instances that 296 have been "disconnected" from the INT 13h "safe hook" chain can be thus 297 discovered. Looking at their associated "safe hook" structure will 298 reveal if they were indeed reviewed by the previous stage. 299