bits 16 org 0x7c3e kernel_sectors equ 64 kernel_segment equ 0x3000 support_flags equ 0x4000 pci_hw_char equ 0x4001 pci_ver equ 0x4002 last_pci_bus equ 0x4004 pci_support equ 0x80 pae_support equ 0x40 in al, 0x92 or al, 0x02 out 0x92, al xor ax, ax mov ss, ax mov sp, 0x7ffc mov ah, 0x01 mov ch, 0x3f int 0x10 mov ax, kernel_segment mov es, ax mov ax, 0x0200 + kernel_sectors xor bx, bx mov cx, 0x0002 xor dh, dh int 0x13 mov ax, 0xb101 int 0x1a cmp edx, 0x20494350 jne no_pci test ah, ah jnz no_pci mov byte [support_flags], pci_support mov byte [pci_hw_char], al mov word [pci_ver], bx mov byte [last_pci_bus], cl no_pci: mov eax, 1 cpuid test dl, 0x40 jz no_pae or byte [support_flags], pae_support no_pae: mov ax, 0x1000 mov es, ax xor di, di mov edx, 0x534d4150 xor ebx, ebx mmap_loop: mov eax, 0xe820 mov ecx, 24 int 0x15 jc mmap_end add di, 24 test ebx, ebx jnz mmap_loop mmap_end: mov word [0x4006], di cli lgdt [gdt] mov eax, cr0 or al, 0x01 mov cr0, eax jmp 0x10:pmode bits 32 pmode: mov ax, 0x18 mov ds, ax mov ss, ax mov esp, 0x00040000 xor ebp, ebp call kernel_segment * 16 halt: hlt jmp halt times $$ + 510 - 0x3e - $ - (gdt.e - gdt) db 0 gdt: dw .e - .t dd .t .t: dq 0x0000_0000_0000_0000;0x00: null dq 0x0040_8900_4f98_0068;0x08: tss, 0x4f98 dq 0x00cf_9a00_0000_ffff;0x10: kernel code dq 0x00cf_9200_0000_ffff;0x18: kernel data dq 0x00cf_fa00_0000_ffff;0x20: user code dq 0x00cf_f200_0000_ffff;0x28: user data .e: dw 0xaa55