;ominOS multiboot stub extern meminit extern setupModules global setup [BITS 32] ; Multiboot setup setup: cmp eax,0x2BADB002 jne notmb lgdt [gdtable] ; load GDTR with location of temporary GDT jmp 0x0018:setsegs ; set up code segment register setsegs: mov ax,0x0020 ; set up data segment registers mov ds,ax mov es,ax mov fs,ax mov gs,ax mov ss,ax ; lets hope 4k is large enough for the boot stack. :] mov eax,0x5000 mov esp,eax ; set stack pointer mov ebp,eax ; and base pointer push ebx ; push multiboot info address call meminit pop ebx mov eax, 0xefffc000; setup new stack in kernel space mov esp, eax ; 0xefffb000-0xefffbffff standard stack mov ebp, eax ; 0xffbfd000-0xffbfdfff tss esp0 stack push ebx call setupModules notmb: ; not a Multiboot compliant bootloader mov word [0xb8000], 0x9f42 notmb2: hlt jmp notmb2 ; Multiboot header magic equ 0x1BADB002 flags equ 0x00000003 align 4 dd magic ; magic dd flags ; flags dd -(magic+flags) ; checksum dd 0 ; header_addr (if flags bit 16 set) dd 0 ; load_addr (if flags bit 16 set) dd 0 ; load_end_addr (if flags bit 16 set) dd 0 ; bss_end_addr (if flags bit 16 set) dd 0 ; entry_addr (if flags bit 16 set) dd 0 ; mode_type (if flags bit 2 set) dd 0 ; width (if flags bit 2 set) dd 0 ; height (if flags bit 2 set) dd 0 ; depth (if flags bit 2 set) ; Temporary Global Descriptor Table gdtable dw 0x0027 ; to be placed in the GDTR dd tempgdt ; 40 bytes (5 entries) @ tempgdt GDT: tempgdt dw 0 ; the first entry in the dw 0 ; global descriptor table dw 0 ; is unused, it can be loaded dw 0 ; but access cause a fault dw 0xFFFF ; limit = 0xFFFF (64KB) dw 0x0000 ; base address = 0 dw 0x9A00 ; readable code segment dw 0x0000 ; granularity = byte, default op size = 16-bit dw 0xFFFF ; limit = 0xFFFF (64KB) dw 0x0000 ; base address = 0 dw 0x9200 ; writable data segment dw 0x0000 ; granularity = byte, default op size = 16-bit CODESEL EQU $-GDT dw 0xFFFF ; limit = 0xFFFFF (4GB) [high F in 4th word] dw 0x0000 ; base address = 0 dw 0x9A00 ; readable code segment dw 0x00CF ; granularity = 4KB, default op size = 32-bit DATASEL EQU $-GDT dw 0xFFFF ; limit = 0xFFFFF (4GB) [high F in 4th word] dw 0x0000 ; base address = 0 dw 0x9200 ; writable data segment dw 0x00CF ; granularity = 4KB, default op size = 32-bit