MBOOT_ALIGN equ 1<<0 MBOOT_MEMINFO equ 1<<1 MBOOT_FLAGS equ MBOOT_ALIGN | MBOOT_MEMINFO MBOOT_MAGIC equ 0x1BADB002 MBOOT_CHECKSUM equ -(MBOOT_MAGIC + MBOOT_FLAGS) [BITS 32] [GLOBAL mboot] [SECTION .multiboot] ALIGN 4 mboot: dd MBOOT_MAGIC dd MBOOT_FLAGS dd MBOOT_CHECKSUM SECTION .bss ALIGN 16 stack_bottom: RESB 16384 stack_top: SECTION .text [GLOBAL _start] [EXTERN kernel_main] _start: push ebx cli call kernel_main jmp $ [GLOBAL load_gdt] ; Allows the C code to call gdt_flush(). load_gdt: mov eax, [esp+4] ; Get the pointer to the GDT, passed as a parameter. lgdt [eax] ; Load the new GDT pointer mov ax, 0x10 ; 0x10 is the offset in the GDT to our data segment mov ds, ax ; Load all data segment selectors mov es, ax mov fs, ax mov gs, ax mov ss, ax jmp 0x08:flush ; 0x08 is the offset to our code segment: Far jump! flush: ret %macro ISR 1 global isr%1 isr%1: cli push byte 0 push byte %1 jmp isr_common %endmacro %macro ISR_ERR 1 global isr%1 isr%1: cli push byte %1 jmp isr_common %endmacro %macro IRQ 2 global irq%1 irq%1: cli push byte 0 push byte %2 jmp irq_common %endmacro ISR 0 ISR 1 ISR 2 ISR 3 ISR 4 ISR 5 ISR 6 ISR 7 ISR_ERR 8 ISR 9 ISR_ERR 10 ISR_ERR 11 ISR_ERR 12 ISR_ERR 13 ISR_ERR 14 ISR 15 ISR 16 ISR_ERR 17 ISR 18 ISR 19 ISR 20 ISR 21 ISR 22 ISR 23 ISR 24 ISR 25 ISR 26 ISR 27 ISR 28 ISR 29 ISR_ERR 30 ISR 31 IRQ 0, 32 IRQ 1, 33 IRQ 2, 34 IRQ 3, 35 IRQ 4, 36 IRQ 5, 37 IRQ 6, 38 IRQ 7, 39 IRQ 8, 40 IRQ 9, 41 IRQ 10, 42 IRQ 11, 43 IRQ 12, 44 IRQ 13, 45 IRQ 14, 46 IRQ 15, 47 extern fault_handler isr_common: pusha push ds push es push fs push gs mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov eax, esp push eax mov eax, fault_handler call eax pop eax pop gs pop fs pop es pop ds popa add esp, 8 iret extern irq_handler irq_common: pusha push ds push es push fs push gs mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov eax, esp push eax mov eax, irq_handler call eax pop eax pop gs pop fs pop es pop ds popa add esp, 8 iret [GLOBAL idt_load] idt_load: mov eax, [esp+4] lidt [eax] ret