Stuff
This commit is contained in:
parent
c7118e1d81
commit
9092d0b8cd
13
Makefile
13
Makefile
|
@ -59,7 +59,7 @@ NC='\033[1;37m'
|
||||||
|
|
||||||
boot.mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
|
boot.mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
|
||||||
@mkdir -p $(BINDIR)/disk
|
@mkdir -p $(BINDIR)/disk
|
||||||
@echo ${CL2}[boot.mbr]${NC} Installing bootloader on image...${CL3}
|
@echo ${CL2}[boot.mbr]${NC} Installing MBR on image...${CL3}
|
||||||
@$(MBRDIR)/grub-install.sh $(BINDIR)/disk.img $(BINDIR)/disk $(MBRDIR)/grub.cfg
|
@$(MBRDIR)/grub-install.sh $(BINDIR)/disk.img $(BINDIR)/disk $(MBRDIR)/grub.cfg
|
||||||
@echo ${CL2}[boot.mbr]${CL} OK${CL3}
|
@echo ${CL2}[boot.mbr]${CL} OK${CL3}
|
||||||
@rmdir $(BINDIR)/disk
|
@rmdir $(BINDIR)/disk
|
||||||
|
@ -69,13 +69,13 @@ boot.loader.asm: $(LOADERDIR)/loader.asm
|
||||||
@$(ASM) $(BOOTFLAGS) $(LOADERDIR)/loader.asm -o $(OBJDIR)/boot/loader.bin > /dev/null
|
@$(ASM) $(BOOTFLAGS) $(LOADERDIR)/loader.asm -o $(OBJDIR)/boot/loader.bin > /dev/null
|
||||||
@echo ${CL2}[boot.loader.asm]${CL} OK${CL3}
|
@echo ${CL2}[boot.loader.asm]${CL} OK${CL3}
|
||||||
|
|
||||||
bootloader: boot.mbr boot.loader.asm
|
loader: boot.loader.asm
|
||||||
@mkdir -p $(BINDIR)/disk
|
@mkdir -p $(BINDIR)/disk
|
||||||
@echo ${CL2}[bootloader]${NC} Constructing bootloader...${CL3}
|
@echo ${CL2}[loader]${NC} Constructing kernel loader...${CL3}
|
||||||
@$(MBRDIR)/mount.sh $(BINDIR)/disk.img $(BINDIR)/disk
|
@$(MBRDIR)/mount.sh $(BINDIR)/disk.img $(BINDIR)/disk
|
||||||
@cp $(OBJDIR)/boot/loader.bin $(BINDIR)/disk/boot/loader.bin
|
@cp $(OBJDIR)/boot/loader.bin $(BINDIR)/disk/boot/loader.bin
|
||||||
@$(MBRDIR)/umount.sh $(BINDIR)/disk
|
@$(MBRDIR)/umount.sh $(BINDIR)/disk
|
||||||
@echo ${CL2}[bootloader]${CL} OK${CL3}
|
@echo ${CL2}[loader]${CL} OK${CL3}
|
||||||
@rmdir $(BINDIR)/disk
|
@rmdir $(BINDIR)/disk
|
||||||
|
|
||||||
make_disk:
|
make_disk:
|
||||||
|
@ -83,8 +83,11 @@ make_disk:
|
||||||
@$(MBRDIR)/create_disk.sh $(BINDIR)/disk.img
|
@$(MBRDIR)/create_disk.sh $(BINDIR)/disk.img
|
||||||
@echo ${CL2}[make_disk]${CL} OK${CL3}
|
@echo ${CL2}[make_disk]${CL} OK${CL3}
|
||||||
|
|
||||||
boot: make_disk bootloader
|
boot: make_disk boot.mbr loader
|
||||||
@echo ${CL2}[[boot]]${CL} Terminated without error.${CL3}
|
@echo ${CL2}[[boot]]${CL} Terminated without error.${CL3}
|
||||||
|
|
||||||
all: boot kernel
|
all: boot kernel
|
||||||
@echo ${CL2}[[all]]${CL} Terminated without error.${CL3}
|
@echo ${CL2}[[all]]${CL} Terminated without error.${CL3}
|
||||||
|
|
||||||
|
# TEST
|
||||||
|
|
||||||
|
|
|
@ -35,17 +35,16 @@ _start:
|
||||||
mov ax, cs ; correcting cs after the horrible far jump
|
mov ax, cs ; correcting cs after the horrible far jump
|
||||||
mov ds, ax ; hm... And ds too
|
mov ds, ax ; hm... And ds too
|
||||||
mov es, ax ; And es because it is jealous
|
mov es, ax ; And es because it is jealous
|
||||||
|
;mov [Bootdrv], dl
|
||||||
mov [Bootdrv], dl
|
|
||||||
xor dl, dl
|
xor dl, dl
|
||||||
jmp 0x0000:main ; pas sûr
|
jmp 0x0000:main ; pas sûr
|
||||||
multiboot_header:
|
|
||||||
|
|
||||||
|
MB_header:
|
||||||
align 4
|
align 4
|
||||||
dd MB_HEADER_MAGIC
|
dd MB_HEADER_MAGIC
|
||||||
dd MB_HEADER_FLAGS
|
dd MB_HEADER_FLAGS
|
||||||
dd CHECKSUM
|
dd CHECKSUM
|
||||||
dd multiboot_header ; Header address
|
dd MB_header ; Header address
|
||||||
dd _start ; Address of code entry point
|
dd _start ; Address of code entry point
|
||||||
dd 00 ; (end of code) not necessary
|
dd 00 ; (end of code) not necessary
|
||||||
dd 00 ; (bss) not necessary
|
dd 00 ; (bss) not necessary
|
||||||
|
@ -61,189 +60,13 @@ MB_start:
|
||||||
add esp, 8 ; Cleanup 8 bytes pushed as arguments
|
add esp, 8 ; Cleanup 8 bytes pushed as arguments
|
||||||
jmp Die
|
jmp Die
|
||||||
|
|
||||||
%include "boot/loader/cpu/cpuid.asm"
|
;; BEGIN OF THE HOLE -------------------------------------------------------- ;;
|
||||||
%include "boot/loader/io/rmterm.asm"
|
|
||||||
%include "boot/loader/io/rmmem.asm"
|
|
||||||
|
|
||||||
main:
|
|
||||||
|
|
||||||
;;GO GDT64
|
|
||||||
cli ; disable interrupts
|
|
||||||
lgdt [GDT64]
|
|
||||||
;; ACTIVATE PROTECTED MODE
|
|
||||||
mov eax, cr0
|
|
||||||
or al, 1b ; PE = 1
|
|
||||||
mov cr0, eax
|
|
||||||
;; DISABLE PAGING
|
|
||||||
mov eax, cr0
|
|
||||||
and eax, 0x7FFFFFFF ; PG = 0
|
|
||||||
; |0|111111111111111111111111111111
|
|
||||||
; |
|
|
||||||
; `------ Paging bit
|
|
||||||
mov cr0, eax
|
|
||||||
|
|
||||||
push dword [VIDEO_MODE]
|
|
||||||
push dword [VGA_HEIGHT]
|
|
||||||
jmp (CODE_SELECTOR-GDT64):main32
|
|
||||||
|
|
||||||
Die:
|
Die:
|
||||||
cli
|
cli
|
||||||
hlt ; die nooooow
|
hlt ; die nooooow
|
||||||
jmp 0xF000:0xFFF0
|
;jmp 0xF000:0xFFF0
|
||||||
|
jmp $
|
||||||
;; END OF THE HOLE ---------------------------------------------------------- ;;
|
;; END OF THE HOLE ---------------------------------------------------------- ;;
|
||||||
|
|
||||||
[BITS 32]
|
main:
|
||||||
main32:
|
|
||||||
pop dword [VGA_HEIGHT32]
|
|
||||||
pop dword [VIDEO_MODE32]
|
|
||||||
|
|
||||||
;; VERIFY A20
|
|
||||||
pushad
|
|
||||||
mov edi,0x112345 ;odd megabyte address.
|
|
||||||
mov esi,0x012345 ;even megabyte address.
|
|
||||||
mov [esi],esi ;making sure that both addresses contain diffrent values.
|
|
||||||
mov [edi],edi ;(if A20 line is cleared the two pointers would point to the address 0x012345 that would contain 0x112345 (edi))
|
|
||||||
cmpsd ;compare addresses to see if the're equivalent.
|
|
||||||
popad
|
|
||||||
jne .A20_on ;if not equivalent , A20 line is set.
|
|
||||||
mov WORD [A20_OK], 0
|
|
||||||
jmp .A20_end
|
|
||||||
.A20_on:
|
|
||||||
mov BYTE [A20_OK], 1
|
|
||||||
.A20_end:
|
|
||||||
|
|
||||||
;; INITIALIZE PROTECTED MODE SEGMENT REGISTERS
|
|
||||||
mov ax, DATA_SELECTOR-GDT64
|
|
||||||
mov ds, ax
|
|
||||||
mov es, ax
|
|
||||||
mov fs, ax
|
|
||||||
mov gs, ax
|
|
||||||
mov ss, ax
|
|
||||||
|
|
||||||
;; ACTIVATE PHYSICAL ADRESS EXTENSION
|
|
||||||
mov eax, cr4
|
|
||||||
or eax, 100000b ; PAE = 1 = 4 Mo / page. 0 = 4 Ko
|
|
||||||
mov cr4, eax
|
|
||||||
|
|
||||||
;;cleanup
|
|
||||||
mov edi, 0x70000
|
|
||||||
mov ecx, 0x10000
|
|
||||||
xor eax, eax
|
|
||||||
rep stosd
|
|
||||||
;;formatting
|
|
||||||
mov dword [0x70000], 0x71000 + 7 ; first PDP table
|
|
||||||
mov dword [0x71000], 0x72000 + 7 ; first page directory
|
|
||||||
mov dword [0x72000], 0x73000 + 7 ; first page table
|
|
||||||
mov edi, 0x73000 ; address of first page table
|
|
||||||
mov eax, 7
|
|
||||||
mov ecx, 256 ; number of pages to map (1 MB)
|
|
||||||
.make_page_entries:
|
|
||||||
stosd
|
|
||||||
add edi, 4
|
|
||||||
add eax, 0x1000
|
|
||||||
loop .make_page_entries
|
|
||||||
;; pointing pml4
|
|
||||||
mov eax, 0x70000 ; Bass address of PML4
|
|
||||||
mov cr3, eax ; load page-map level-4 base
|
|
||||||
|
|
||||||
;; ACTIVATE LONG MODE
|
|
||||||
mov ecx, 0xC0000080 ; address of MSR
|
|
||||||
rdmsr ; read MSR
|
|
||||||
or eax, 100000000b ; LME = 1. (Long Mode Enable)
|
|
||||||
wrmsr ; write MSR
|
|
||||||
|
|
||||||
;; ACTIVATE PAGING
|
|
||||||
mov eax, cr0
|
|
||||||
or eax, 0x80000000 ; make bit 31 (PG = Paging) to 1 :
|
|
||||||
; |1|000000000000000000000000000000
|
|
||||||
; |
|
|
||||||
; `------ Paging bit
|
|
||||||
mov cr0, eax
|
|
||||||
push dword 0
|
|
||||||
push dword [VIDEO_MODE]
|
|
||||||
push dword 0
|
|
||||||
push dword [VGA_HEIGHT]
|
|
||||||
jmp (LONG_SELECTOR-GDT64):main64
|
|
||||||
|
|
||||||
[BITS 64]
|
|
||||||
|
|
||||||
;; DATA
|
|
||||||
Init db "Booting OS/K !", 0x0D, 0x0A, 0x0D, 0x0A, 0x09, " Checking CPUID...",0
|
|
||||||
CPUIDD db 0x09, " Checking CPUID...", 0
|
|
||||||
EnA20 db 0x09, " Enabling A20 line...", 0
|
|
||||||
%ifdef DEBUG
|
|
||||||
ReadAttempt db 0x09, " Attempt to read a sector with ATA commands...", 0x0A, 0x0D, 0x0A, 0x0D, 0
|
|
||||||
%else
|
|
||||||
ReadAttempt db 0x09, " Attempt to read a sector with ATA commands...", 0
|
|
||||||
%endif
|
|
||||||
txt db 0x09, " Switching to Long Mode... ", 0
|
|
||||||
EndOfLoader db "End of loader.bin. System will halt !", 0x0A, 0x0D, 0
|
|
||||||
Reinit db "Booting OS/K !", 0x0D, 0x0A, 0x0D, 0x0A, 0
|
|
||||||
Pass db " OK", 0x0A, 0x0D, 0
|
|
||||||
Fail db " FAIL!", 0x0A, 0x0D, 0
|
|
||||||
msg db "The system is now in x64 mode. Is this not beautiful ?", 0x0A, 0x0D, 0
|
|
||||||
FileNotFound db "Second Stage Error : The Kernel was not found.", 0x0A, 0x0D, 0
|
|
||||||
DiskError db "Second Stage Error : The Disk has crashed.", 0x0A, 0x0D, 0
|
|
||||||
filename db "KERNEL BIN"
|
|
||||||
|
|
||||||
%include "boot/loader/io/lmmem.asm"
|
|
||||||
%include "boot/loader/io/lmterm.asm"
|
|
||||||
%include "boot/loader/io/ata.asm"
|
|
||||||
%include "boot/loader/cpu/cpu.asm"
|
|
||||||
%include "boot/loader/fs/fat.asm"
|
|
||||||
|
|
||||||
main64:
|
|
||||||
pop qword [VGA_HEIGHT64]
|
|
||||||
pop qword [VIDEO_MODE64]
|
|
||||||
;; INITIALIZE STACK
|
|
||||||
mov rsp, 0x9F000
|
|
||||||
|
|
||||||
call clear
|
|
||||||
|
|
||||||
;; Printing
|
|
||||||
mov bl, 0x0B
|
|
||||||
mov esi, Reinit
|
|
||||||
call write
|
|
||||||
|
|
||||||
mov bl, 0x0F
|
|
||||||
mov esi, CPUIDD
|
|
||||||
call write
|
|
||||||
|
|
||||||
mov bl, 0x0A
|
|
||||||
mov esi, Pass
|
|
||||||
call write
|
|
||||||
|
|
||||||
mov bl, 0x0F
|
|
||||||
mov esi, EnA20
|
|
||||||
call write
|
|
||||||
|
|
||||||
call check_a20
|
|
||||||
|
|
||||||
mov bl, 0x0F
|
|
||||||
mov esi, txt
|
|
||||||
call write
|
|
||||||
|
|
||||||
mov bl, 0x0A
|
|
||||||
mov esi, Pass
|
|
||||||
call write
|
|
||||||
|
|
||||||
mov bl, 0x0D
|
|
||||||
mov esi, msg
|
|
||||||
call write
|
|
||||||
|
|
||||||
mov bl, 0x0F
|
|
||||||
mov esi, ReadAttempt
|
|
||||||
call write
|
|
||||||
|
|
||||||
call temporize ; Temporized because the ATA drive must be ready
|
|
||||||
|
|
||||||
mov bl, 1
|
|
||||||
mov bh, 1
|
|
||||||
call ata_read
|
|
||||||
|
|
||||||
mov bl, 0x0D
|
|
||||||
mov esi, EndOfLoader
|
|
||||||
call write
|
|
||||||
|
|
||||||
jmp Die
|
jmp Die
|
||||||
|
|
||||||
|
|
|
@ -24,10 +24,10 @@
|
||||||
;=----------------------------------------------------------------------------=;
|
;=----------------------------------------------------------------------------=;
|
||||||
|
|
||||||
;; MULTIBOOT HEADER
|
;; MULTIBOOT HEADER
|
||||||
%define MB_AOUT_KLUDGE 1 << 16 ; We are not an ELF executable
|
MB_AOUT_KLUDGE equ 1 << 16 ; We are not an ELF executable
|
||||||
%define MB_ALIGN 1 << 0 ; Ask to align loaded modules on page boundaries
|
MB_ALIGN equ 1 << 0 ; Ask to align loaded modules on page boundaries
|
||||||
%define MB_MEMINFO 1 << 1 ; Ask to provide memory map
|
MB_MEMINFO equ 1 << 1 ; Ask to provide memory map
|
||||||
%define MB_HEADER_MAGIC 0x1BADB002
|
MB_HEADER_MAGIC equ 0x1BADB002
|
||||||
%define MB_HEADER_FLAGS MB_AOUT_KLUDGE|MB_ALIGN|MB_MEMINFO
|
MB_HEADER_FLAGS equ MB_AOUT_KLUDGE|MB_ALIGN|MB_MEMINFO
|
||||||
%define CHECKSUM -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
|
CHECKSUM equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
|
||||||
%define KERNEL_STACK 0x00200000 ; Stack starts at the 2mb address & grows down
|
KERNEL_STACK equ 0x00200000 ; Stack starts at the 2mb address & grows down
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue