;entry symbol, required by ld, to make an executable bits 32 section .text ; Some constants before we get started. PageDirPtr equ $200000 PageTablePtr equ $201000 FourK equ $1000 ;magic stuff to enable multi-boot compliance... section .text mb_magic: dd 1BADB002h mb_flags: dd 2 mb_checksum: dd 0-2-1BADB002h global _start _start: ;- Jump to start of loader... jmp init ;- include the kernel binary. kernelbinary: incbin 'kernel.bin' init: ;- we need the size of the kernel bin div 4 in ecx ;- so... mov eax, init ;- get end of kernel bin mov ecx, kernelbinary ;- get start of kernel bin sub eax, ecx ;- Sub start from end to get size in bytes shr eax, 2 ;- divide size in bytes by for to get size in Dwords mov ecx, eax ;- We need this in ecx cld ;- not that I care what direction the copy goes in :-P lea esi, [kernelbinary] ;- load address of kernel binary (source) lea edi, [100000h] ;- load address of destination rep movsd; ;- do the move. ;- Now we need to setup our paging system... ;- Start by filling in the entries in our page table. ;- We are going to map <4M pysical to >3G virtual xor eax,eax ;- eax = 0 - loop counter xor ebx,ebx ;- ebx = 0 - mapping address used for first 1M mov ecx,PageTablePtr ;- ecx - points to PageTable entry loop1: mov edx,ebx ;- copy address into ecx or edx,3 ;- edx or 3 - attribute set to supervisor level, read/write, present(011 binary) mov [ecx], edx ;- copy our entry in. add ebx, FourK ;- Add 4k to target address. add ecx, 4 ;- Add 4 bytes to our entry pointer inc eax ;- inc the loop counter cmp eax,1023 ;- have we reached the last entry in first 1M mapping? jle loop1 ;- if not go back and do it all again. jmp init_loop2 ;- jump to initialization for loop2 init_loop2: ;- Start by zero-ing out the page directory... mov ecx, PageDirPtr ;- Point me at entry 0 or ebx, 3 ;- // attribute set to: supervisor level, read/write, present(011 binary) mov eax,0 ;- eax = 0 - loop counter xor ebx,ebx ;- ebx = 0 or ebx,2 ;- ebx or 2 = attribute set to: supervisor level, read/write, not present(010 binary) loop2: ;- check to see if this itteration requires our page table as entry. cmp eax, 768 je inserttable ;- if we are going to insert our table jump out and do it. ;- insert the entry Mov [ecx], ebx; ;- copy our entry in. back: Add ecx, 4 ;- move our entry pointer inc eax ;- inc the loop counter cmp eax,1023 ;- have we reached the last entry? jle loop2 ;- if not go back and do it all again. jmp startpaging ;- loop is finished - begin paging inserttable: mov ebx, PageTablePtr ;- Get the page table pointer mov ecx, ebx ;- Insert the entry xor ebx, ebx ;- clear ebx or ebx, 2 ;- restore attribute settings jmp back ;- go back into page directory loop. ;- Now enable paging startpaging: mov eax, $200000 mov cr3, eax mov eax, cr0 or eax, $8000000 mov cr0, eax ;- Finally we jump to 3G+1M (our kernel is linked here) jmp 0C0100001h