I have been following the Operating System development tutorial on http://www.brokenthorn.com. Right now I'm trying to setup the BIOS parameter block with this code:
jmp loader
bpbName db "NubOS",0,0,0
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
However, when I try to open the disk using the ImDisk driver for virtual floppies, it says that the drive needs to be formatted. Is the code I'm using correct?
Try a short jump: the sector begins with jmp short loader
, followed by nop
, then go bpbName
through bsFileSystem
, then loader:
and all your code and then the last 2 bytes of the 512-byte sector being 0x55
and 0xAA
. These two must be at offsets 510
and 511
respectively.
You're missing the 3-byte jump instruction before the BPB. The bytes-per-sector word should be at offset 0x0b relative to the beginning of the disk, not at 0x08. The jump will go to the bootloader code which is after the BPB (and if the jump is short enough that it only requires two bytes, it's followed by a nop).
If a machine will never be booted from the disk, you can put any arbitrary values in those first three bytes, but it's traditional to have a jump anyway, that goes to a piece of code that prints something like This disk is not bootable
and then halts the machine.
You can find a complete implementation of a FAt12 driver in assembly here: Simple Operating System with Fat 12 Driver.
来源:https://stackoverflow.com/questions/10457120/fat-12-implementation