|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- ; Boot sector, freely inspired by http://jojo.ouvaton.org/dossiers/boot_sector/tutorial02.html
- ; Sets a GDT and protected mode
- ; Copy the kernel (or stage2) to 0x1000 (linear)
- ; Max kernel size is 25600 bytes (50 sectors)
-
-
- %define BASE 0x100 ; 0x0100:0x0 = 0x1000
- %define KSIZE 50
-
- [BITS 16]
- [ORG 0x0]
-
- ; Code starts here, jump to our real entry point, skipping print
- jmp start
-
- ; print string using BIOS
- print:
- push ax
- push bx
- .start:
- lodsb ; ds:si -> al
- cmp al,0
- jz .fin
- mov ah,0x0E ; 0x0e function of BIOS 0x10 interruption
- mov bx,0x07 ; bx -> attribute, al -> ascii
- int 0x10
- jmp .start
-
- .fin:
- pop bx
- pop ax
- ret
-
- ; Entry point
- start:
- mov [bootdrv],dl ; boot drive
-
- ; Stack and section initialization at 0x07C0
- mov ax,0x07C0
- mov ds,ax
- mov es,ax
- mov ax,0x8000 ; stack at 0xFFFF
- mov ss,ax
- mov sp, 0xf000
-
- ; print 'Loading kernel ...'
- mov si, ldKernel
- call print
-
- ; Load kernel
- xor ax,ax
- int 0x13
-
- push es
- mov ax,BASE
- mov es,ax
- mov bx,0
- mov ah,2
- mov al,KSIZE
- mov ch,0
- mov cl,2
- mov dh,0
- mov dl,[bootdrv]
- int 0x13
- pop es
-
- ; GDT pointer
- mov ax,gdtend ; GDT limit
- mov bx,gdt
- sub ax,bx
- mov word [gdtptr],ax
-
- xor eax,eax ; GDT linear address
- xor ebx,ebx
- mov ax,ds
- mov ecx,eax
- shl ecx,4
- mov bx,gdt
- add ecx,ebx
- mov dword [gdtptr+2],ecx
-
- ; pmode
- cli
- lgdt [gdtptr] ; load GDT
- mov eax, cr0
- or ax,1
- mov cr0,eax ; enter Protected Mode
-
- jmp next
- next:
- mov ax,0x10 ; data segment
- mov ds,ax
- mov fs,ax
- mov gs,ax
- mov es,ax
- mov ss,ax
- mov esp,0x9F000
-
- jmp dword 0x8:0x1000 ; jump to kernel _start at 0x1000 of 'second' selector (*8)
-
-
- ;--------------------------------------------------------------------
- bootdrv: db 0
- ldKernel db "Loading kernel ...",13,10,0
- ;--------------------------------------------------------------------
- gdt:
- db 0,0,0,0,0,0,0,0
- gdt_cs:
- db 0xFF,0xFF,0x0,0x0,0x0,10011011b,11011111b,0x0
- gdt_ds:
- db 0xFF,0xFF,0x0,0x0,0x0,10010011b,11011111b,0x0
- gdtend:
-
- ;--------------------------------------------------------------------
- gdtptr:
- dw 0 ; limit
- dd 0 ; base
-
-
- ;--------------------------------------------------------------------
- ;; fill remaining space with NOPs
- times 510-($-$$) db 144
- dw 0xAA55
|