global start extern kernel_boot extern kernel_main extern kernel_start extern kernel_end bits 32 ; base, limit, access, flags %macro gdt_entry 4 db %2 & 0xff db (%2 >> 8) & 0xff db %1 & 0xff db (%1 >> 8) & 0xff db (%1 >> 16) & 0xff db %3 db ((%2 >> 16) & 0x0f) | (%4 << 4) db (%1 >> 24) & 0xff %endmacro MAGIC equ 0xe85250d6 FLAGS equ 0 LENGTH equ mb_end - mb_start CHECKSUM equ -(MAGIC + LENGTH) VGABUF equ 0x000B8000 KRNMAP equ 0xC0000000 section .multiboot.data align 8 mb_start: dd MAGIC dd FLAGS dd LENGTH dd CHECKSUM dw 0 dw 0 dd 8 mb_end: section .rodata align 16 gdt_start: gdt_entry 0, 0, 0, 0 gdt_entry 0, 0xFFFFF, 0x9A, 0xC gdt_entry 0, 0xFFFFF, 0x92, 0xC gdt_end: gdt_descriptor: dw gdt_end - gdt_start - 1 dd gdt_start section .bootstrap_stack align 16 stack_start: resb 16384 ; 16 KiB stack_end: section .bss align 4096 page_directory: resb 4096 page_table1: resb 4096 section .multiboot.text align 8 start: ; push ebx ; call kernel_boot ; pop eax mov edi, page_table1 - KRNMAP mov esi, 0 mov ecx, 1023 paging_cmp: cmp esi, kernel_start jl paging_add cmp esi, kernel_end - KRNMAP jge paging_map mov edx, esi or edx, 0x003 mov [edi], edx paging_add: add esi, 4096 add edi, 4 loop paging_cmp paging_map: mov dword [page_table1 - KRNMAP + 1023 * 4], VGABUF | 0x003 mov dword [page_directory - KRNMAP + 0], page_table1 - KRNMAP + 0x003 mov dword [page_directory - KRNMAP + 768 * 4], page_table1 - KRNMAP + 0x003 mov ecx, page_directory - KRNMAP mov cr3, ecx mov ecx, cr0 or ecx, 0x80010000 mov cr0, ecx lea ecx, load_gdt jmp near ecx section .text align 8 load_gdt: cli lgdt [gdt_descriptor] mov eax, cr0 or al, 1 mov cr0, eax jmp 0x08:load_kernel load_kernel: mov dword [page_directory], 0 mov ecx, cr3 mov cr3, ecx mov ax, 0x10 mov ds, ax mov ss, ax mov es, ax mov fs, ax mov gs, ax mov esp, stack_end mov ebp, stack_end sti call kernel_main cli halt: hlt jmp halt