0% found this document useful (0 votes)
42 views26 pages

Writing A Bootloader

The document provides a guide on writing a boot loader that displays 'Hello World!' on the screen using NASM assembler and QEMU emulator. It covers the process of turning on a computer, entering real mode, and transitioning to protected mode with a Global Descriptor Table. Additionally, it discusses integrating C++ with assembly and offers resources for further learning.

Uploaded by

Wan Sabrina
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
42 views26 pages

Writing A Bootloader

The document provides a guide on writing a boot loader that displays 'Hello World!' on the screen using NASM assembler and QEMU emulator. It covers the process of turning on a computer, entering real mode, and transitioning to protected mode with a Global Descriptor Table. Additionally, it discusses integrating C++ with assembly and offers resources for further learning.

Uploaded by

Wan Sabrina
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 26

Writing a Boot Loader

How to write ‘Hello World!’ to the screen in


increasingly complicated ways
Software
• NASM Assembler (http://www.nasm.us/)

• QEMU Emulator (https://www.qemu.org/)

• = No destroyed PC hardware ;) brew install nasm qemu


Turning on the Computer

• Press the Power Button

• BIOS Hardware Test

• Loads the first 512 bytes off the floppy disk/hard drive

• Does byte 510-512 equal 0x55AA? YES jump to 0x7C00!


Real Mode
• http://wiki.osdev.org/Real_Mode

• BIOS Interrupts https://en.wikipedia.org/wiki/BIOS_interrupt_call

• 16 bit instructions

• Only 1 MB of memory can be accessed (ignoring segments)


output 16 bit instructions

ah=0x0e int 0x10 means


‘Write Character in TTY mode’

loads byte at address `ds:si` into `al`.

clear interrupts
halt cpu

pad remaining 510 bytes with 0


magic!
nasm -f bin boot1.asm -o boot.bin
qemu-system-i386 -fda boot.bin
32 bit Mode
• Enable A20 Line (http://wiki.osdev.org/A20_Line)

• Setup a Global Descriptor Table (http://wiki.osdev.org/GDT)

• Set Protected Mode Bit on cr0

• Jump to 32 bit Code!


Global Descriptor Table
• Tells the CPU what memory ranges mean
• Useful for memory protection
• Tells CPU about 64/32/16 bit modes
• Can you execute this? Can you read/write this?

• Load with special lgdt instruction!


code segment from 0-0xFFFF with
read/write/execute and
32 bits flags

data segment from 0-0xFFFF with


read/write and 32 bits flags

pointer structure telling CPU how big the


GDT is
load gdt table

set protected mode bit in cr0

set all the other segments to data

set code segment and jump!


Protected Mode VGA

Text Mode 3
80x50 characters with
16 colours memory mapped to
loads byte at address `ds:esi` into `al`.

set foreground colour to blue (1)


Beyond 512 Bytes
Disk Interrupts (https://en.wikipedia.org/wiki/INT_13H)
bios magic dl register value

ah=0x2 int 0x13 means


‘Read Sectors From Drive’
our boot sector zero padding
bootsector magic value

0x0F00 = white text (15)


Getting to C++!
avoid C++ name mangling

+80 to write on second line (80x50 mode)


Cross Compiler
• A compiler specifically targeted to your platform

• A Complete Nightmare to compile!

• Removes weird OS hacks, optimisations and function call


conventions
Call C++ from Assembly

esp = stack pointer


it grows down!

reserve 16KB of stack


Link it all together!
output asm directly in binary
not ELF or EXE, etc.
start at 0x7c00

put the boot loader first


all the C++ stuff after
Resources

• http://wiki.osdev.org/Main_Page

• http://3zanders.co.uk/2017/10/13/writing-a-bootloader/

• https://os.phil-opp.com/multiboot-kernel/

• http://www.jamesmolloy.co.uk/tutorial_html/
Questions?

You might also like