meillo@0: global loader ; making entry point visible to linker meillo@0: extern kmain ; main is defined elsewhere meillo@0: meillo@0: ; setting up the Multiboot header - see GRUB docs for details meillo@0: MODULEALIGN equ 1<<0 ; align loaded modules on page meillo@0: ; boundaries meillo@0: MEMINFO equ 1<<1 ; provide memory map meillo@0: FLAGS equ MODULEALIGN | MEMINFO ; this is the Multiboot 'flag' field meillo@0: MAGIC equ 0x1BADB002 ; 'magic number' lets bootloader find the header meillo@0: CHECKSUM equ -(MAGIC + FLAGS) ; checksum required meillo@0: meillo@0: section .multiboot meillo@0: align 4 meillo@0: MultiBootHeader: meillo@0: dd MAGIC meillo@0: dd FLAGS meillo@0: dd CHECKSUM meillo@0: meillo@0: ; reserve initial kernel stack space meillo@0: STACKSIZE equ 0x4000 ; that's 16k. meillo@0: meillo@0: loader: meillo@0: mov esp, stack+STACKSIZE ; set up the stack meillo@0: push eax ; pass Multiboot magic number meillo@0: push ebx ; pass Multiboot info structure meillo@0: call kmain ; call kernel proper meillo@0: cli meillo@0: hang: meillo@0: hlt ; halt machine should kernel return meillo@0: jmp hang meillo@0: meillo@0: section .bss meillo@0: align 32 meillo@0: stack: meillo@0: resb STACKSIZE ; reserve stack on a quadword boundary