Add bootloader's 2nd stage written in C and asm
Now the bootloader is divided in stage1 and stage 2, the kernel isn't loaded so it's useless (for now). The Stage 1 of the bootloader prints some strings and loads the second stage into memory. The second stage prints a hello world message. After this commit I'll divide the main branch into stable and coding (stable is working code, like all the commits I did until this day, coding will be the branch where I push all the code I write, so there may be a lot of errors or the code doesn't compile. I you want to use or just try XanvicOS use the stable branch)
This commit is contained in:
parent
9476a54f13
commit
c5a3efb225
25
Makefile
25
Makefile
@ -1,9 +1,12 @@
|
||||
ASM=nasm
|
||||
CC=gcc
|
||||
CC16=/usr/bin/watcom/binl/wcc
|
||||
LD16=/usr/bin/watcom/binl/wlink
|
||||
|
||||
SRC_DIR=src
|
||||
BUILD_DIR=build
|
||||
|
||||
.PHONY: all floppy_image kernel bootloader clean always
|
||||
.PHONY: all immagine_floppy kernel bootloader clean always
|
||||
|
||||
|
||||
#Immagine floppy
|
||||
@ -13,8 +16,10 @@ immagine_floppy: $(BUILD_DIR)/main_floppy.img
|
||||
$(BUILD_DIR)/main_floppy.img: bootloader kernel
|
||||
dd if=/dev/zero of=$(BUILD_DIR)/main_floppy.img bs=512 count=2880
|
||||
mkfs.fat -F 12 -n "XanvOS" $(BUILD_DIR)/main_floppy.img
|
||||
dd if=$(BUILD_DIR)/bootloader.bin of=$(BUILD_DIR)/main_floppy.img conv=notrunc
|
||||
dd if=$(BUILD_DIR)/stage1.bin of=$(BUILD_DIR)/main_floppy.img conv=notrunc
|
||||
mcopy -i $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/stage2.bin "::stage2.bin"
|
||||
mcopy -i $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/kernel.bin "::kernel.bin"
|
||||
mcopy -i $(BUILD_DIR)/main_floppy.img test.txt "::test.txt"
|
||||
|
||||
|
||||
#Kernel
|
||||
@ -22,15 +27,23 @@ $(BUILD_DIR)/main_floppy.img: bootloader kernel
|
||||
kernel: $(BUILD_DIR)/kernel.bin
|
||||
|
||||
$(BUILD_DIR)/kernel.bin: always
|
||||
$(ASM) $(SRC_DIR)/kernel/kernel.asm -f bin -o $(BUILD_DIR)/kernel.bin
|
||||
$(MAKE) -C $(SRC_DIR)/kernel BUILD_DIR=$(abspath $(BUILD_DIR))
|
||||
|
||||
|
||||
#Bootloader
|
||||
|
||||
bootloader: $(BUILD_DIR)/bootloader.bin
|
||||
bootloader: stage1 stage2
|
||||
|
||||
$(BUILD_DIR)/bootloader.bin: always
|
||||
$(ASM) $(SRC_DIR)/bootloader/boot.asm -f bin -o $(BUILD_DIR)/bootloader.bin
|
||||
stage1: $(BUILD_DIR)/stage1.bin
|
||||
|
||||
$(BUILD_DIR)/stage1.bin: always
|
||||
$(MAKE) -C $(SRC_DIR)/bootloader/stage1 BUILD_DIR=$(abspath $(BUILD_DIR))
|
||||
|
||||
|
||||
stage2: $(BUILD_DIR)/stage2.bin
|
||||
|
||||
$(BUILD_DIR)/stage2.bin: always
|
||||
$(MAKE) -C $(SRC_DIR)/bootloader/stage2 BUILD_DIR=$(abspath $(BUILD_DIR))
|
||||
|
||||
|
||||
#Always
|
||||
|
15
src/bootloader/stage1/Makefile
Normal file
15
src/bootloader/stage1/Makefile
Normal file
@ -0,0 +1,15 @@
|
||||
BUILD_DIR?=build/
|
||||
ASM?=nasm
|
||||
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: stage1
|
||||
|
||||
stage1: $(BUILD_DIR)/stage1.bin
|
||||
|
||||
$(BUILD_DIR)/stage1.bin:
|
||||
$(ASM) stage1.asm -f bin -o $(BUILD_DIR)/stage1.bin
|
||||
|
||||
clean:
|
||||
rm -f $(BUILD_DIR)/stage1.bin
|
@ -101,28 +101,28 @@ start:
|
||||
xor bx, bx
|
||||
mov di, buffer
|
||||
|
||||
.cerca_kernel:
|
||||
mov si, file_kernel_bin
|
||||
.cerca_stage2:
|
||||
mov si, file_stage2_bin
|
||||
mov cx, 11
|
||||
push di
|
||||
repe cmpsb
|
||||
pop di
|
||||
je .kernel_trovato
|
||||
je .stage2_trovato
|
||||
|
||||
add di, 32
|
||||
inc bx
|
||||
cmp bx, [dir_entries_count]
|
||||
jl .cerca_kernel
|
||||
jl .cerca_stage2
|
||||
|
||||
;Kernel non trovato
|
||||
jmp errore_kernel_non_trovato
|
||||
jmp errore_stage2_non_trovato
|
||||
|
||||
.kernel_trovato:
|
||||
mov si, msg_kernel_trovato
|
||||
.stage2_trovato:
|
||||
mov si, msg_stage2_trovato
|
||||
call puts
|
||||
|
||||
mov ax, [di + 26]
|
||||
mov [kernel_cluster], ax
|
||||
mov [stage2_cluster], ax
|
||||
|
||||
mov ax, [reserved_sectors]
|
||||
mov bx, buffer
|
||||
@ -130,12 +130,12 @@ start:
|
||||
mov dl, [ebr_drive_number]
|
||||
call lettura_disco
|
||||
|
||||
mov bx, KERNEL_LOAD_SEGMENT
|
||||
mov bx, STAGE2_LOAD_SEGMENT
|
||||
mov es, bx
|
||||
mov bx, KERNEL_LOAD_OFFSET
|
||||
mov bx, STAGE2_LOAD_OFFSET
|
||||
|
||||
.carica_kernel:
|
||||
mov ax, [kernel_cluster]
|
||||
.carica_stage2:
|
||||
mov ax, [stage2_cluster]
|
||||
add ax, 31
|
||||
|
||||
mov cl, 1
|
||||
@ -144,7 +144,7 @@ start:
|
||||
|
||||
add bx, [bytes_per_sector]
|
||||
|
||||
mov ax, [kernel_cluster]
|
||||
mov ax, [stage2_cluster]
|
||||
mov cx, 3
|
||||
mul cx
|
||||
mov cx, 2
|
||||
@ -168,18 +168,17 @@ start:
|
||||
cmp ax, 0x0FF8
|
||||
jae .fine_lettura
|
||||
|
||||
mov [kernel_cluster], ax
|
||||
jmp .carica_kernel
|
||||
mov [stage2_cluster], ax
|
||||
jmp .carica_stage2
|
||||
|
||||
.fine_lettura:
|
||||
mov dl, [ebr_drive_number]
|
||||
|
||||
mov ax, KERNEL_LOAD_SEGMENT
|
||||
mov ax, STAGE2_LOAD_SEGMENT
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
|
||||
jmp KERNEL_LOAD_SEGMENT:KERNEL_LOAD_OFFSET
|
||||
jmp premi_per_riavviare
|
||||
jmp STAGE2_LOAD_SEGMENT:STAGE2_LOAD_OFFSET
|
||||
|
||||
;Trasforma/Converte un indirizzo LBA in uno CHS
|
||||
|
||||
@ -280,11 +279,11 @@ msg_caricamento:
|
||||
msg_errore_lettura:
|
||||
db 'Errore del disco', ENDL, 0
|
||||
|
||||
msg_kernel_non_trovato:
|
||||
db 'Kernel non trovato', ENDL, 0
|
||||
msg_stage2_non_trovato:
|
||||
db 'Stage 2 non trovato', ENDL, 0
|
||||
|
||||
msg_kernel_trovato:
|
||||
db 'Kernel trovato', ENDL, 0
|
||||
msg_stage2_trovato:
|
||||
db 'Stage 2 trovato', ENDL, 0
|
||||
|
||||
;Errori
|
||||
|
||||
@ -293,17 +292,17 @@ errore_floppy:
|
||||
call puts
|
||||
jmp premi_per_riavviare
|
||||
|
||||
errore_kernel_non_trovato:
|
||||
mov si, msg_kernel_non_trovato
|
||||
errore_stage2_non_trovato:
|
||||
mov si, msg_stage2_non_trovato
|
||||
call puts
|
||||
jmp premi_per_riavviare
|
||||
|
||||
;Variabili
|
||||
|
||||
file_kernel_bin: db 'KERNEL BIN'
|
||||
kernel_cluster: dw 0
|
||||
KERNEL_LOAD_SEGMENT equ 0x2000
|
||||
KERNEL_LOAD_OFFSET equ 0
|
||||
file_stage2_bin: db 'STAGE2 BIN'
|
||||
stage2_cluster: dw 0
|
||||
STAGE2_LOAD_SEGMENT equ 0x2000
|
||||
STAGE2_LOAD_OFFSET equ 0
|
||||
|
||||
;Cose che non so dove mettere
|
||||
|
34
src/bootloader/stage2/Makefile
Normal file
34
src/bootloader/stage2/Makefile
Normal file
@ -0,0 +1,34 @@
|
||||
BUILD_DIR?=build/
|
||||
ASM?=nasm
|
||||
ASMFLAGS?=-f obj
|
||||
CC?=gcc
|
||||
CC16?=/usr/bin/watcom/binl/wcc
|
||||
CFLAGS16?=
|
||||
LD16?=/usr/bin/watcom/binl/wlink
|
||||
|
||||
SOURCES_C=$(wildcard *.c)
|
||||
SOURCES_ASM=$(wildcard *.asm)
|
||||
OBJECTS_C=$(patsubst %.c, $(BUILD_DIR)/stage2/c/%.obj, $(SOURCES_C))
|
||||
OBJECTS_ASM=$(patsubst %.asm, $(BUILD_DIR)/stage2/asm/%.obj, $(SOURCES_ASM))
|
||||
|
||||
.PHONY: all stage2 clean always
|
||||
|
||||
all: stage2
|
||||
|
||||
stage2: $(BUILD_DIR)/stage2.bin
|
||||
|
||||
$(BUILD_DIR)/stage2.bin: $OBJECTS_ASM $OBJECTS_C
|
||||
$(LD16) NAME $(BUILD_DIR)/stage2.bin FILE \{ $(OBJECTS_ASM) $(OBJECTS_C) \} OPTION_MAP=$(BUILD_DIR)/stage2.map @linker.lnk
|
||||
|
||||
$(BUILD_DIR)/stage2/c/%.obj: %.c always
|
||||
$(CC16) $(CFLAGS16) -fo=$@ $<
|
||||
|
||||
$(BUILD_DIR)/stage2/asm/%.obj: %.asm always
|
||||
$(ASM) $(ASMFLAGS) -o $@ $<
|
||||
|
||||
always:
|
||||
mkdir -p $(BUILD_DIR)/stage2/c
|
||||
mkdir -p $(BUILD_DIR)/stage2/asm
|
||||
|
||||
clean:
|
||||
rm -f $(BUILD_DIR)/stage2.bin
|
56
src/bootloader/stage2/stage2.asm
Normal file
56
src/bootloader/stage2/stage2.asm
Normal file
@ -0,0 +1,56 @@
|
||||
org 0x0
|
||||
bits 16
|
||||
|
||||
|
||||
%define ENDL 0x0D, 0x0A
|
||||
|
||||
;Codice del kernel
|
||||
start:
|
||||
mov si, msg_helloworld
|
||||
call puts
|
||||
call premi_per_riavviare
|
||||
|
||||
.halt:
|
||||
cli
|
||||
hlt
|
||||
|
||||
puts:
|
||||
; save registers we will modify
|
||||
push si
|
||||
push ax
|
||||
push bx
|
||||
|
||||
.loop:
|
||||
lodsb
|
||||
or al, al
|
||||
jz .fine
|
||||
|
||||
mov ah, 0x0E
|
||||
mov bh, 0
|
||||
int 0x10
|
||||
|
||||
jmp .loop
|
||||
|
||||
.fine:
|
||||
pop bx
|
||||
pop ax
|
||||
pop si
|
||||
ret
|
||||
|
||||
;Stringhe
|
||||
msg_helloworld:
|
||||
db 'Hello World dallo stage2 del Bootloader!', ENDL, 0
|
||||
|
||||
msg_premi_per_riavviare:
|
||||
db 'Premi un tasto per riavviare...', ENDL, 0
|
||||
;Errori
|
||||
|
||||
;Variabili
|
||||
|
||||
;Cose che non so dove mettere
|
||||
premi_per_riavviare:
|
||||
mov si, msg_premi_per_riavviare
|
||||
call puts
|
||||
mov ah, 0
|
||||
int 16h
|
||||
jmp 0FFFFh:0
|
17
src/kernel/Makefile
Normal file
17
src/kernel/Makefile
Normal file
@ -0,0 +1,17 @@
|
||||
BUILD_DIR?=build/
|
||||
ASM?=nasm
|
||||
CC?=gcc
|
||||
CC16?=/usr/bin/watcom/binl/wcc
|
||||
LD16?=/usr/bin/watcom/binl/wlink
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: kernel
|
||||
|
||||
kernel: $(BUILD_DIR)/kernel.bin
|
||||
|
||||
$(BUILD_DIR)/kernel.bin:
|
||||
$(ASM) kernel.asm -f bin -o $(BUILD_DIR)/kernel.bin
|
||||
|
||||
clean:
|
||||
rm -f $(BUILD_DIR)/kernel.bin
|
Loading…
x
Reference in New Issue
Block a user