This commit is contained in:
Adrien Bourmault 2019-03-04 22:34:07 +01:00
parent c7118e1d81
commit 9092d0b8cd
4 changed files with 22 additions and 196 deletions

View File

@ -59,7 +59,7 @@ NC='\033[1;37m'
boot.mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
@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
@echo ${CL2}[boot.mbr]${CL} OK${CL3}
@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
@echo ${CL2}[boot.loader.asm]${CL} OK${CL3}
bootloader: boot.mbr boot.loader.asm
loader: boot.loader.asm
@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
@cp $(OBJDIR)/boot/loader.bin $(BINDIR)/disk/boot/loader.bin
@$(MBRDIR)/umount.sh $(BINDIR)/disk
@echo ${CL2}[bootloader]${CL} OK${CL3}
@echo ${CL2}[loader]${CL} OK${CL3}
@rmdir $(BINDIR)/disk
make_disk:
@ -83,8 +83,11 @@ make_disk:
@$(MBRDIR)/create_disk.sh $(BINDIR)/disk.img
@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}
all: boot kernel
@echo ${CL2}[[all]]${CL} Terminated without error.${CL3}
# TEST

View File

@ -35,17 +35,16 @@ _start:
mov ax, cs ; correcting cs after the horrible far jump
mov ds, ax ; hm... And ds too
mov es, ax ; And es because it is jealous
mov [Bootdrv], dl
;mov [Bootdrv], dl
xor dl, dl
jmp 0x0000:main ; pas sûr
multiboot_header:
MB_header:
align 4
dd MB_HEADER_MAGIC
dd MB_HEADER_FLAGS
dd CHECKSUM
dd multiboot_header ; Header address
dd MB_header ; Header address
dd _start ; Address of code entry point
dd 00 ; (end of code) not necessary
dd 00 ; (bss) not necessary
@ -61,189 +60,13 @@ MB_start:
add esp, 8 ; Cleanup 8 bytes pushed as arguments
jmp Die
%include "boot/loader/cpu/cpuid.asm"
%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
;; BEGIN OF THE HOLE -------------------------------------------------------- ;;
Die:
cli
hlt ; die nooooow
jmp 0xF000:0xFFF0
;jmp 0xF000:0xFFF0
jmp $
;; END OF THE HOLE ---------------------------------------------------------- ;;
[BITS 32]
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
main:
jmp Die

View File

@ -24,10 +24,10 @@
;=----------------------------------------------------------------------------=;
;; MULTIBOOT HEADER
%define MB_AOUT_KLUDGE 1 << 16 ; We are not an ELF executable
%define MB_ALIGN 1 << 0 ; Ask to align loaded modules on page boundaries
%define MB_MEMINFO 1 << 1 ; Ask to provide memory map
%define MB_HEADER_MAGIC 0x1BADB002
%define MB_HEADER_FLAGS MB_AOUT_KLUDGE|MB_ALIGN|MB_MEMINFO
%define CHECKSUM -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
%define KERNEL_STACK 0x00200000 ; Stack starts at the 2mb address & grows down
MB_AOUT_KLUDGE equ 1 << 16 ; We are not an ELF executable
MB_ALIGN equ 1 << 0 ; Ask to align loaded modules on page boundaries
MB_MEMINFO equ 1 << 1 ; Ask to provide memory map
MB_HEADER_MAGIC equ 0x1BADB002
MB_HEADER_FLAGS equ MB_AOUT_KLUDGE|MB_ALIGN|MB_MEMINFO
CHECKSUM equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
KERNEL_STACK equ 0x00200000 ; Stack starts at the 2mb address & grows down

Binary file not shown.