249 lines
4.3 KiB
NASM
249 lines
4.3 KiB
NASM
|
org 0100h
|
||
|
jmp BEGIN
|
||
|
%include "pm.inc"
|
||
|
;GDT
|
||
|
DESC_VOID: Descriptor 0,0,0
|
||
|
DESC_GRAPH: Descriptor 0b8000h,0ffffh,DA_DRW | DA_DPL3
|
||
|
DESC_FLAT_C: Descriptor 0,0fffffh,DA_CR | DA_32 | DA_LIMIT_4K
|
||
|
DESC_FLAT_RW: Descriptor 0,0fffffh,DA_DRW | DA_32 | DA_LIMIT_4K
|
||
|
DESC_FLAT_USER_C: Descriptor 0,0fffffh,DA_CR | DA_32| DA_LIMIT_4K | DA_DPL3
|
||
|
DESC_FLAT_USER_RW: Descriptor 0,0fffffh,DA_DRW | DA_32 | DA_LIMIT_4K | DA_DPL3
|
||
|
|
||
|
GDTLEN equ $ - DESC_VOID
|
||
|
|
||
|
GDTPTR: dw GDTLEN - 1
|
||
|
dd LOADERINFLAT + DESC_VOID
|
||
|
|
||
|
;Paging
|
||
|
PDEBASE equ 100000h
|
||
|
PTEBASE equ 101000h
|
||
|
|
||
|
;kernel
|
||
|
LOADERBASE equ 09000h
|
||
|
LOADEROFFSET equ 0100h
|
||
|
LOADERINFLAT equ LOADERBASE*10h
|
||
|
|
||
|
KERNELFILENAME db 'KERNEL BIN',0
|
||
|
KERNELBASE equ 03000h
|
||
|
KERNELOFFSET equ 0000h
|
||
|
KERNELINFLAT equ KERNELBASE*10h + KERNELOFFSET
|
||
|
|
||
|
;Selectors
|
||
|
SLCT_FLAT_C equ DESC_FLAT_C - DESC_VOID
|
||
|
SLCT_GRAPH equ DESC_GRAPH - DESC_VOID
|
||
|
SLCT_FLAT_RW equ DESC_FLAT_RW - DESC_VOID
|
||
|
|
||
|
;==================Section .DATA==============================
|
||
|
;Variables
|
||
|
;Operating System Information
|
||
|
;OS:
|
||
|
OSINFO1: db 'Hyper-Assembler Operating System 1.0',0
|
||
|
OSINFO2: db "Loader written by Orange'S, Kernel written by Hyper-Assembler",0
|
||
|
KERNELFILELOADCOMPLETE db 'Kernel.bin Loaded to 0x30000',0
|
||
|
|
||
|
;GETMEMORY
|
||
|
RAMINFO1: db "Memory Information:",0
|
||
|
RAMTABLE16: db ' BASE L BASE H Length L Length H Type ',0
|
||
|
RAMSIZE: db 'RAM SIZE:',0
|
||
|
GETMEMFAIL: db 'Failed to Get The Memory',0
|
||
|
RAMAVAILABLE: db ' - Available',0
|
||
|
RAMRESERVED: db ' - Reserved',0
|
||
|
|
||
|
;Protected Mode:
|
||
|
PMINFO: db 'Protected Mode Entered...',0
|
||
|
PMINFO32 equ PMINFO + LOADERINFLAT
|
||
|
|
||
|
;PAGING:
|
||
|
PGINFO: db 'Paging Started...',0
|
||
|
PGINFO32 equ PGINFO + LOADERINFLAT
|
||
|
PTEINFO: db 'PTE Table BASE: ',0
|
||
|
PTEINFO32 equ PTEINFO + LOADERINFLAT
|
||
|
PDEINFO: db 'PDE Table BASE: ',0
|
||
|
PDEINFO32 equ PDEINFO + LOADERINFLAT
|
||
|
CR3INFO: db 'cr3: ',0
|
||
|
CR3INFO32 equ CR3INFO + LOADERINFLAT
|
||
|
|
||
|
;Variables Used in Functions
|
||
|
IO16_SPACE: db ' ',0
|
||
|
IO32_SPACE equ IO16_SPACE + LOADERINFLAT
|
||
|
IO16_RETURN: db 0Ah,0
|
||
|
IO32_RETURN equ IO16_RETURN + LOADERINFLAT
|
||
|
GRAPHPOS: dd 0
|
||
|
GRAPHPOS_32 equ GRAPHPOS + LOADERINFLAT
|
||
|
GETMEMBUFF: times 1024 db 0
|
||
|
GETMEMNUM: dd 0
|
||
|
GETMEMNUM_32 equ GETMEMBUFF + LOADERINFLAT
|
||
|
DISPMEMTOTAL: dd 0
|
||
|
DISPMEMTOTAL_32 equ DISPMEMTOTAL + LOADERINFLAT
|
||
|
KERNELLOADED: db 'KERNEL LOADED IN MEM.',0
|
||
|
KERNELLOADED_32 equ KERNELLOADED + LOADERINFLAT
|
||
|
%include "FAT12Header.inc"
|
||
|
;=========================STACK32=============================
|
||
|
[bits 32]
|
||
|
STACK32BASE:
|
||
|
times 1024 db 0
|
||
|
TOP:
|
||
|
STACK32TOP equ LOADERINFLAT + TOP
|
||
|
|
||
|
;==========================CODE16==============================
|
||
|
[bits 16]
|
||
|
%include "io16.lib"
|
||
|
%include "fat12readfile.lib"
|
||
|
BEGIN:
|
||
|
mov ax,cs
|
||
|
mov ds,ax
|
||
|
mov ss,ax
|
||
|
mov es,ax
|
||
|
|
||
|
mov ax,0003h
|
||
|
int 10h ;clear
|
||
|
|
||
|
xor eax,eax
|
||
|
mov eax,OSINFO1
|
||
|
push eax
|
||
|
call DISPSTR16
|
||
|
add esp,4
|
||
|
|
||
|
call DISPRETURN16
|
||
|
|
||
|
xor eax,eax
|
||
|
mov eax,OSINFO2
|
||
|
push eax
|
||
|
call DISPSTR16
|
||
|
add esp,4
|
||
|
|
||
|
call DISPRETURN16
|
||
|
|
||
|
call DISPRETURN16
|
||
|
|
||
|
xor eax,eax
|
||
|
mov eax,RAMINFO1
|
||
|
push eax
|
||
|
call DISPSTR16
|
||
|
add esp,4
|
||
|
|
||
|
call DISPRETURN16
|
||
|
|
||
|
call GETMEM16
|
||
|
|
||
|
mov eax,dword [ds:GETMEMNUM]
|
||
|
cmp eax,0
|
||
|
jne GETMEMSUCCESSFUL
|
||
|
xor eax,eax
|
||
|
mov eax,GETMEMFAIL
|
||
|
push eax
|
||
|
call DISPSTR16
|
||
|
pop eax
|
||
|
|
||
|
GETMEMSUCCESSFUL:
|
||
|
|
||
|
call DISPMEM16
|
||
|
call DISPRETURN16
|
||
|
|
||
|
;FAT12ReadFile(ULONG16 Base,ULONG16 Offset,ULONG16 OffsetFileName)
|
||
|
push KERNELFILENAME
|
||
|
push KERNELOFFSET
|
||
|
push KERNELBASE
|
||
|
call FAT12ReadFile
|
||
|
add esp,6
|
||
|
|
||
|
xor eax,eax
|
||
|
mov eax,KERNELFILELOADCOMPLETE
|
||
|
push eax
|
||
|
call DISPSTR16
|
||
|
add esp,4
|
||
|
|
||
|
call DISPRETURN16
|
||
|
|
||
|
;load gdt
|
||
|
lgdt [GDTPTR]
|
||
|
|
||
|
;close interupt
|
||
|
cli
|
||
|
|
||
|
;open A20
|
||
|
in al,92h
|
||
|
or al,00000010b
|
||
|
out 92h,al
|
||
|
|
||
|
;prepare to switch to the protected mode
|
||
|
mov eax,cr0
|
||
|
or eax,1
|
||
|
mov cr0,eax
|
||
|
|
||
|
jmp dword SLCT_FLAT_C:(CODE32_START + LOADERINFLAT)
|
||
|
|
||
|
|
||
|
|
||
|
;===================CODE32======================
|
||
|
[bits 32]
|
||
|
%include "mem32.lib"
|
||
|
%include "io32.lib"
|
||
|
CODE32_START:
|
||
|
mov ax,SLCT_FLAT_RW
|
||
|
mov ss,ax
|
||
|
mov ds,ax
|
||
|
mov es,ax
|
||
|
mov gs,ax
|
||
|
|
||
|
mov ax,SLCT_GRAPH
|
||
|
mov gs,ax
|
||
|
|
||
|
mov sp,STACK32TOP
|
||
|
|
||
|
mov eax,PMINFO32
|
||
|
push eax
|
||
|
call near DISPSTR32
|
||
|
pop eax
|
||
|
|
||
|
|
||
|
;Setup paging
|
||
|
call PAGINGINIT32
|
||
|
|
||
|
call DISPRETURN32
|
||
|
|
||
|
mov eax,PGINFO32
|
||
|
push eax
|
||
|
call near DISPSTR32
|
||
|
pop eax
|
||
|
|
||
|
call DISPRETURN32
|
||
|
;Print PDE Table Base
|
||
|
mov eax,PDEINFO32
|
||
|
push eax
|
||
|
call DISPSTR32
|
||
|
pop eax
|
||
|
|
||
|
mov eax,PDEBASE
|
||
|
push eax
|
||
|
call DISPINTEAX32
|
||
|
pop eax
|
||
|
|
||
|
call DISPRETURN32
|
||
|
;Print PTE table base
|
||
|
mov eax,PTEINFO32
|
||
|
push eax
|
||
|
call DISPSTR32
|
||
|
pop eax
|
||
|
|
||
|
mov eax,PTEBASE
|
||
|
push eax
|
||
|
call DISPINTEAX32
|
||
|
pop eax
|
||
|
|
||
|
call DISPRETURN32
|
||
|
;Print cr3
|
||
|
mov eax,CR3INFO32
|
||
|
push eax
|
||
|
call DISPSTR32
|
||
|
pop eax
|
||
|
|
||
|
mov eax,cr3
|
||
|
push eax
|
||
|
call DISPINTEAX32
|
||
|
pop eax
|
||
|
|
||
|
;Jump to The Kernel
|
||
|
|
||
|
jmp SLCT_FLAT_C:KERNELINFLAT
|