diff --git a/01-simple-boot-sector/.README.md.swp b/01-simple-boot-sector/.README.md.swp new file mode 100644 index 0000000..5821b1e Binary files /dev/null and b/01-simple-boot-sector/.README.md.swp differ diff --git a/01-simple-boot-sector/README.md b/01-simple-boot-sector/README.md new file mode 100644 index 0000000..7c68686 --- /dev/null +++ b/01-simple-boot-sector/README.md @@ -0,0 +1,56 @@ +This is very exciting, we're going to create our own boot sector! + +Theory +------ + +When the computer boots, the BIOS doesn't know how to load the OS, so it +delegates that task to the boot sector. Thus, the boot sector must be +placed in a known, standard location. That location is the first sector +of the disk (cylinder 0, head 0, sector 0) and it takes 512 bytes. + +To make sure that the "disk is bootable", the BIOS checks that bytes +511 and 512 of the alleged boot sector are bytes `0xAA55`. + +This is the simplest boot sector ever: + +``` +e9 fd ff 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +[ 29 more lines with sixteen zero-bytes each ] +00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa +``` + +It is basically all zeros, ending with the 16-bit value +`0xAA55` (beware of indianness, x86 is little-endian). +The first three bytes perform an infinite jump + +Simplest boot sector ever +------------------------- + +You can either write the above 512 bytes +with a binary editor, or just write a very +simple assembler code: + +```nasm +; Infinite loop (e9 fd ff) +loop: + jmp loop + +; Fill with 510 zeros minus the size of the previous code +times 510-($-$$) db 0 +; Magic number +dw 0xaa55 +``` + +To compile: +`nasm -f bin boot_sect_simple.asm -o boot_sect_simple.bin` + +> OSX warning: if this drops an error, read chapter 00 again + +I know you're anxious to try it out (I am!), so let's do it: + +`qemu boot_sect_simple.bin` + +You will see a window open which says "Booting from Hard Disk..." and +nothing else. When was the last time you were so excited to see an infinite +loop? ;-) diff --git a/01-simple-boot-sector/boot_sect_simple.asm b/01-simple-boot-sector/boot_sect_simple.asm new file mode 100644 index 0000000..ce78003 --- /dev/null +++ b/01-simple-boot-sector/boot_sect_simple.asm @@ -0,0 +1,6 @@ +; A simple boot sector program that loops forever +loop: + jmp loop + +times 510-($-$$) db 0 +dw 0xaa55