global smp_go ; master boot record for application processors ;[org 0x7000] smp_go: [bits 16] cli ;switch off interrupts! lgdt [gdt_descriptor] ;load descriptor table! ;switch on 32-bit protected mode mov eax, cr0 or eax,0x1 mov cr0, eax jmp 0x8:init_pm [bits 32] LLOCK: dd 0 init_pm: mov ax, 0x10 mov ds, ax mov ss, ax mov es, ax mov fs, ax mov gs, ax mov ebp, 0x8000 mov esp, ebp call boot_32_pm ;continue booting in 32-bit protected mode boot_32_pm: mov eax, 1 ; semaphore xchg eax, [LLOCK] cmp eax,1 hlt je $ jmp $ ; loop forever here call [0x8010] ;kernel_ap ;jump into our Kernel! jmp $ ; should never be reached gdt_start: gdt_null: ;null descriptor (2 x 4 bytes) dd 0x0 dd 0x0 gdt_code: ; flags: ; present: 1 / privilege: 00 / type: 1 ; code: 1 / conforming: 0 / readable: 1 / accessed: 0 ; granularity: 1 / 16-bit default: 1 / 64-bit seg: 0 / AVL: 0 dw 0xffff ;limit dw 0x0 ;base db 0x0 ;base db 10011010b ;flags db 11001111b ;flags & seg.limit db 0x0 ;base gdt_data: ; flags: ; code: 0 / expand down: 0 / writable: 1 / accessed: 0 dw 0xffff dw 0x0 db 0x0 db 10010010b db 11001111b db 0x0 gdt_end: gdt_descriptor: dw gdt_end-gdt_start-1 dd gdt_start CODE_SEG equ gdt_code - gdt_start DATA_SEG equ gdt_data - gdt_start