diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-09-04 23:38:33 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-09-04 23:38:33 +0200 |
| commit | 467e19b262d435f1820539bc0c85ed4fa31b9687 (patch) | |
| tree | c3ee7690b089713614309857ecfc046d6a13d160 /boot/stage2.asm | |
| parent | 487ecc1615ccc0368f1520c1146b2b43cdab6577 (diff) | |
Finally we have a 2 stage bootloader !
This one can load the ramdis up to 0xfffff :)
Diffstat (limited to 'boot/stage2.asm')
| -rw-r--r-- | boot/stage2.asm | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/boot/stage2.asm b/boot/stage2.asm new file mode 100644 index 0000000..27f9832 --- /dev/null +++ b/boot/stage2.asm @@ -0,0 +1,133 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; THE FOOL-BOOT-LOADER +; +; * X sectors of our kernel loaded at KERNEL_OFFSET from floppy +; +; * memory map made available at MEMMAP_OFFSET +; (check at MEMMEP_SIZE_OFFSET for number of entries) +; +; * the VESA mode specified by VESA_MODE_SELECT will be set up +; (check at VESA_MODES, and VESA_MODE_INFO +; for additional information) +; +; * interrupts disabled +; +; * 32-bit protected mode set up. +; +; * esp set to 0x90000 +; +; * A20 gate opened +; +; * and finally we will jump into the C world to kernel_main() ! +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;we want 16-bit instructions, before we switch to 32-bit protected mode. +[bits 16] + +;define origin of boot record in memory: 0x7c00 +;this is where the BIOS per definition will put the first +;512 bytes of data from the boot device +;The Boot record is identified by the last 2 magic bytes: 0xaa55 (?) +[org 0x7e00] + +;;define some constants +;;where we will load our kernel into memory and some +;;other memory locations +; +KERNEL_DATA equ 10 ;sector on disk where the kernel starts +KERNEL_SECTOR equ 0x1000 +KERNEL_OFFSET equ 0x0000 + +MEMMAP_SIZE_OFFSET equ 0x7c00 +MEMMAP_OFFSET equ 0x7c01 +VESA_MODES equ 0x8300 +VESA_MODE_INFO equ 0x8400 +VESA_MODE_SELECT equ 0x4114 +; +jmp boot_16 ;start boot process + +;;SOME Global Data, mainly info/error strings +BOOT_DRIVE: + db 0xff +STR_VERSION: + db "Fool Loader Stage 2 v0.5",0 + +VESA_CHECK1: + db "1",0 +VESA_CHECK2: + db "2",0 +VESA_CHECK3: + db "3",0 +CHECK_A20: + db "A",0 +STR_LOAD + db "Loading Kernel...",0 +; +;;lets put our temporary GDT (Global Descriptor Table) here +;;kernel should move this away +%include "boot/GDT.asm" +; +;;include 16-bit real mode routines (print_string, disk_load, vesa_setup,check_a20) +%include "boot/disk_load_16.asm" +;%include "boot/check_a20_16.asm" +%include "boot/print_string_16.asm" +%include "boot/vesa_setup_16.asm" +; +;;include our routines for switching to 32-bit protected mode +%include "boot/pm.asm" +; +; +;;get memory map routine +%include "boot/memmap.asm" +; +;;;;;;;;; BOOT 16-bit real ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +;;lets start +[bits 16] + +boot_16: + + +; pr info + mov bx, STR_VERSION + call print_string + call print_nextline + +; remember BOOT_DRIVE again + mov [BOOT_DRIVE],dl + +; Load the KERNEL Image + mov bx, STR_LOAD + call print_string + call print_nextline + call disk_load_16 + + ;get memory map from bios before we enter 32 bit protected mode + mov ax,0 ; set target address in es:di (0:offset) + mov es,ax + mov di,MEMMAP_OFFSET + call BiosGetMemoryMap ; this will also put the number of entries + ; of the memory map at MEMMAP_SIZE_OFFSET + call VesaSetup + + call switch_to_pm +; +;;;;;;;;; BOOT 32-bit protected mode;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +[bits 32] +boot_32_pm: + + ;Fast A20 Gate: + ;http://wiki.osdev.org/A20_Line + + in al, 0x92 + or al, 2 + out 0x92, al + + ; call kernel! + mov eax,0 ;tell the kernel + ; we are the booting processor + call 0x10000 ;jump into our Kernel! + |
