refactor: reorganize bootloader source code
This commit is contained in:
parent
a4d5179982
commit
74e09f7b33
13
Makefile
13
Makefile
|
@ -4,12 +4,13 @@ TOPDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
|
|||
SYSROOTDIR := $(TOPDIR)/sysroot
|
||||
TOOLSDIR := $(TOPDIR)/tools
|
||||
|
||||
RM = echo
|
||||
AS = fasm
|
||||
RM = rm -f
|
||||
|
||||
MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\"
|
||||
MK_COMMIT := \"$(shell git rev-parse --short HEAD)\"
|
||||
|
||||
SUBDIRS := tools include boot kernel lib bin
|
||||
SUBDIRS := external tools include boot kernel lib bin
|
||||
|
||||
TARGET = stupid.tar.gz floppy_boot.img
|
||||
ifneq ($(OS),Windows_NT)
|
||||
|
@ -28,7 +29,7 @@ clean: GOAL:=clean
|
|||
.PHONY: $(SUBDIRS)
|
||||
$(SUBDIRS):
|
||||
@echo "📁 $@"
|
||||
DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL)
|
||||
@DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL)
|
||||
|
||||
.PHONY: stupid.iso
|
||||
stupid.iso: $(SUBDIRS)
|
||||
|
@ -46,8 +47,8 @@ stupid.tar.gz: $(SUBDIRS)
|
|||
floppy_boot.img: $(SUBDIRS)
|
||||
dd if=/dev/zero of=$@ bs=512 count=1440
|
||||
mformat -C -f 1440 -i $@
|
||||
dd if=boot/bootsector.bin of=$@ conv=notrunc
|
||||
mcopy -i $@ boot/stpdboot.sys ::/STPDBOOT.SYS
|
||||
dd if=boot/bootsect/bootsector.bin of=$@ conv=notrunc
|
||||
mcopy -i $@ boot/loader/stpdldr.sys ::/STPDLDR.SYS
|
||||
mcopy -i $@ kernel/vmstupid.sys ::/VMSTUPID.SYS
|
||||
|
||||
.PHONY: run
|
||||
|
@ -63,4 +64,4 @@ run: all
|
|||
|
||||
.PHONY: clean
|
||||
clean: $(SUBDIRS)
|
||||
$(RM) $(TARGET) $(SYSROOTDIR)
|
||||
$(RM) $(TARGET)
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
SUBDIRS = cmd
|
||||
|
||||
TOPGOALS = all clean install
|
||||
|
||||
SUBDIRS = cmd
|
||||
|
@ -7,7 +5,7 @@ SUBDIRS = cmd
|
|||
.PHONY: $(SUBDIRS)
|
||||
$(SUBDIRS):
|
||||
@echo "📁 bin/$@"
|
||||
DESTDIR=$(DESTDIR)/bin $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
@DESTDIR=$(DESTDIR)/bin $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
|
||||
.PHONY: $(TOPGOALS)
|
||||
$(TOPGOALS): $(SUBDIRS)
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
section '.text' code
|
||||
|
||||
public main
|
||||
public _start
|
||||
_start:
|
||||
main:
|
||||
int 0x2A
|
||||
|
||||
|
|
|
@ -1,39 +1,11 @@
|
|||
AS = fasm
|
||||
RM = rm
|
||||
TOPGOALS = all clean install
|
||||
|
||||
TARGET = bootsector.bin stpdboot.sys bootia32.efi
|
||||
SUBDIRS = bootsect loader efi
|
||||
|
||||
STAGE0_SRCS = boot0.asm \
|
||||
const.inc \
|
||||
fat12.inc
|
||||
.PHONY: $(SUBDIRS)
|
||||
$(SUBDIRS):
|
||||
@echo "📁 boot/$@"
|
||||
@DESTDIR=$(DESTDIR) $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
|
||||
STAGE1_SRCS = boot1.asm \
|
||||
const.inc \
|
||||
a20.inc \
|
||||
multiboot.inc
|
||||
|
||||
BOOTIA32_EFI_SRCS = bootia32.asm \
|
||||
uefi.inc
|
||||
|
||||
.PHONY: all
|
||||
all: $(TARGET)
|
||||
|
||||
bootsector.bin: $(STAGE0_SRCS)
|
||||
$(AS) boot0.asm $@
|
||||
|
||||
stpdboot.sys: $(STAGE1_SRCS)
|
||||
$(AS) boot1.asm $@
|
||||
|
||||
bootia32.efi: $(BOOTIA32_EFI_SRCS)
|
||||
$(AS) bootia32.asm $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) $(TARGET)
|
||||
|
||||
.PHONY: install
|
||||
install: $(TARGET)
|
||||
@ mkdir -p $(DESTDIR)
|
||||
install stpdboot.sys $(DESTDIR)
|
||||
@ mkdir -p $(DESTDIR)/EFI/BOOT
|
||||
install bootia32.efi $(DESTDIR)/EFI/BOOT
|
||||
.PHONY: $(TOPGOALS)
|
||||
$(TOPGOALS): $(SUBDIRS)
|
||||
|
|
120
boot/boot0.asm
120
boot/boot0.asm
|
@ -1,120 +0,0 @@
|
|||
INCLUDE 'const.inc'
|
||||
|
||||
ORG STAGE0_BASE
|
||||
USE16
|
||||
|
||||
jmp short _start
|
||||
nop
|
||||
|
||||
; Boot Record
|
||||
OEM_identifier db 'STUPID '
|
||||
bytes_per_sector dw 512
|
||||
sectors_per_cluster db 1
|
||||
reserved_sectors dw 1
|
||||
FAT_count db 2
|
||||
root_dir_entries dw 224
|
||||
total_sectors dw 2880
|
||||
media_desc_type db 0xF0
|
||||
sectors_per_FAT dw 9
|
||||
sectors_per_track dw 18
|
||||
heads_per_cylinder dw 2
|
||||
hidden_sectors dd 0
|
||||
large_sector_count dd 0
|
||||
|
||||
; Extended Boot Record
|
||||
drive_number db 0x0
|
||||
reserved db 0x0
|
||||
signature db 0x29 ; 0x28 or 0x29
|
||||
volume_id dd 0xB00B135 ; hope mine will grow :'(
|
||||
volume_label db 'Stupid Boot'
|
||||
system_id db 'FAT12 '
|
||||
|
||||
|
||||
_start:
|
||||
cli
|
||||
cld
|
||||
jmp 0x0:.canonicalize_cs
|
||||
|
||||
.canonicalize_cs:
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov ss, ax
|
||||
mov es, ax
|
||||
mov sp, 0x7c00
|
||||
|
||||
mov [drive_number], dl
|
||||
|
||||
; reset floppy disk
|
||||
@@:
|
||||
mov dl, [drive_number]
|
||||
xor ah, ah
|
||||
int 0x13
|
||||
jc @b
|
||||
|
||||
call fat_load_root
|
||||
|
||||
; search in root directory
|
||||
|
||||
mov si, kernel_file
|
||||
call fat_search_root
|
||||
jc .error_not_found
|
||||
mov [kernel_start], ax
|
||||
|
||||
mov si, stage1_file
|
||||
call fat_search_root
|
||||
jc .error_not_found
|
||||
mov [stage1_start], ax
|
||||
|
||||
; load fat
|
||||
xor ax, ax
|
||||
mov al, [FAT_count]
|
||||
mul word [sectors_per_FAT]
|
||||
mov cx, ax
|
||||
mov ax, [reserved_sectors]
|
||||
|
||||
xor bx, bx
|
||||
|
||||
call disk_read_sectors
|
||||
|
||||
; preload kernel
|
||||
mov ax, KERNEL_PRELOAD/0x10
|
||||
mov es, ax
|
||||
mov ax, [kernel_start]
|
||||
xor bx, bx
|
||||
call fat_load_binary
|
||||
|
||||
; load stage 2
|
||||
mov ax, STAGE1_BASE/0x10
|
||||
mov es, ax
|
||||
mov ax, [stage1_start]
|
||||
xor bx, bx
|
||||
call fat_load_binary
|
||||
|
||||
jmp 0x0:STAGE1_BASE
|
||||
|
||||
.error_not_found:
|
||||
push si
|
||||
mov si, msg_error
|
||||
call bios_print
|
||||
pop si
|
||||
call bios_print
|
||||
mov si, msg_not_found
|
||||
call bios_print
|
||||
hlt
|
||||
jmp $
|
||||
|
||||
INCLUDE "utils.inc"
|
||||
INCLUDE "fat12.inc"
|
||||
|
||||
msg_error db "ERROR: ", 0
|
||||
msg_not_found db " not found", CR, LF, 0
|
||||
|
||||
kernel_file db "VMSTUPIDSYS", 0
|
||||
stage1_file db "STPDBOOTSYS", 0
|
||||
|
||||
kernel_start dw 0x0
|
||||
stage1_start dw 0x0
|
||||
|
||||
|
||||
rb 0x7C00+512-2-$
|
||||
db 0x55, 0xAA
|
18
boot/bootsect/Makefile
Normal file
18
boot/bootsect/Makefile
Normal file
|
@ -0,0 +1,18 @@
|
|||
TARGET = bootsector.bin
|
||||
|
||||
FLOPPY_SRCS = floppy.asm \
|
||||
../common/const.inc \
|
||||
../common/fat12.inc
|
||||
|
||||
.PHONY: all
|
||||
all: $(TARGET)
|
||||
|
||||
bootsector.bin: $(FLOPPY_SRCS)
|
||||
$(AS) floppy.asm $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) $(TARGET)
|
||||
|
||||
.PHONY: install
|
||||
install: $(TARGET)
|
122
boot/bootsect/floppy.asm
Normal file
122
boot/bootsect/floppy.asm
Normal file
|
@ -0,0 +1,122 @@
|
|||
format binary
|
||||
use16
|
||||
|
||||
include '../common/const.inc'
|
||||
|
||||
org BOOTSECT_BASE
|
||||
|
||||
jmp short _start
|
||||
nop
|
||||
|
||||
; Boot Record
|
||||
OEM_identifier db 'STUPID '
|
||||
bytes_per_sector dw 512
|
||||
sectors_per_cluster db 1
|
||||
reserved_sectors dw 1
|
||||
FAT_count db 2
|
||||
root_dir_entries dw 224
|
||||
total_sectors dw 2880
|
||||
media_desc_type db 0xF0
|
||||
sectors_per_FAT dw 9
|
||||
sectors_per_track dw 18
|
||||
heads_per_cylinder dw 2
|
||||
hidden_sectors dd 0
|
||||
large_sector_count dd 0
|
||||
|
||||
; Extended Boot Record
|
||||
drive_number db 0x0
|
||||
reserved db 0x0
|
||||
signature db 0x29 ; 0x28 or 0x29
|
||||
volume_id dd 0xB00B135 ; hope mine will grow :'(
|
||||
volume_label db 'Stupid Boot'
|
||||
system_id db 'FAT12 '
|
||||
|
||||
|
||||
_start:
|
||||
cli
|
||||
cld
|
||||
jmp 0x0:.canonicalize_cs
|
||||
|
||||
.canonicalize_cs:
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov ss, ax
|
||||
mov es, ax
|
||||
mov sp, 0x7c00
|
||||
|
||||
mov [drive_number], dl
|
||||
|
||||
; reset floppy disk
|
||||
@@:
|
||||
mov dl, [drive_number]
|
||||
xor ah, ah
|
||||
int 0x13
|
||||
jc @b
|
||||
|
||||
call fat_load_root
|
||||
|
||||
; search in root directory
|
||||
|
||||
mov si, kernel_file
|
||||
call fat_search_root
|
||||
jc .error_not_found
|
||||
mov [kernel_start], ax
|
||||
|
||||
mov si, stage1_file
|
||||
call fat_search_root
|
||||
jc .error_not_found
|
||||
mov [stage1_start], ax
|
||||
|
||||
; load fat
|
||||
xor ax, ax
|
||||
mov al, [FAT_count]
|
||||
mul word [sectors_per_FAT]
|
||||
mov cx, ax
|
||||
mov ax, [reserved_sectors]
|
||||
|
||||
xor bx, bx
|
||||
|
||||
call disk_read_sectors
|
||||
|
||||
; preload kernel
|
||||
mov ax, KERNEL_PRELOAD/0x10
|
||||
mov es, ax
|
||||
mov ax, [kernel_start]
|
||||
xor bx, bx
|
||||
call fat_load_binary
|
||||
|
||||
; load stage 2
|
||||
mov ax, LOADER_BASE/0x10
|
||||
mov es, ax
|
||||
mov ax, [stage1_start]
|
||||
xor bx, bx
|
||||
call fat_load_binary
|
||||
|
||||
jmp 0x0:LOADER_BASE
|
||||
|
||||
.error_not_found:
|
||||
push si
|
||||
mov si, msg_error
|
||||
call bios_print
|
||||
pop si
|
||||
call bios_print
|
||||
mov si, msg_not_found
|
||||
call bios_print
|
||||
hlt
|
||||
jmp $
|
||||
|
||||
include '../common/bios.inc'
|
||||
include '../common/fat12.inc'
|
||||
|
||||
msg_error db "ERROR: ", 0
|
||||
msg_not_found db " not found", CR, LF, 0
|
||||
|
||||
kernel_file db "VMSTUPIDSYS", 0
|
||||
stage1_file db "STPDLDR SYS", 0
|
||||
|
||||
kernel_start dw 0x0
|
||||
stage1_start dw 0x0
|
||||
|
||||
|
||||
rb 0x7C00+512-2-$
|
||||
db 0x55, 0xAA
|
|
@ -2,8 +2,8 @@ CR = 0x0D
|
|||
LF = 0x0A
|
||||
|
||||
; -------- Address ----------
|
||||
STAGE0_BASE = 0x7C00
|
||||
STAGE1_BASE = 0x1000
|
||||
BOOTSECT_BASE = 0x7C00
|
||||
LOADER_BASE = 0x1000
|
||||
MULTIBOOT_BASE = 0x100000
|
||||
DISK_BUFFER = 0x8000
|
||||
KERNEL_PRELOAD = 0xF000
|
6
boot/common/macro.inc
Normal file
6
boot/common/macro.inc
Normal file
|
@ -0,0 +1,6 @@
|
|||
macro defn name
|
||||
{
|
||||
virtual at 0
|
||||
name name
|
||||
end virtual
|
||||
}
|
21
boot/efi/Makefile
Normal file
21
boot/efi/Makefile
Normal file
|
@ -0,0 +1,21 @@
|
|||
TARGET = BOOTIA32.EFI
|
||||
|
||||
BOOTIA32_EFI_SRCS = bootia32.asm \
|
||||
uefi.inc \
|
||||
../common/const.inc \
|
||||
../common/macro.inc
|
||||
|
||||
.PHONY: all
|
||||
all: $(TARGET)
|
||||
|
||||
BOOTIA32.EFI: $(BOOTIA32_EFI_SRCS)
|
||||
$(AS) bootia32.asm $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) $(TARGET)
|
||||
|
||||
.PHONY: install
|
||||
install: $(TARGET)
|
||||
@ mkdir -p $(DESTDIR)/EFI/BOOT
|
||||
install $(TARGET) $(DESTDIR)/EFI/BOOT
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
section '.text' code executable readable
|
||||
|
||||
include '../common/const.inc'
|
||||
include '../common/macro.inc'
|
||||
include 'uefi.inc'
|
||||
|
||||
; ESP => return address
|
||||
|
@ -29,14 +31,15 @@ efimain:
|
|||
|
||||
jmp $
|
||||
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
|
||||
section '.reloc' fixups data discardable
|
||||
|
||||
section '.data' data readable writeable
|
||||
|
||||
hello_msg du 'StupidOS EFI Bootloader', 13, 10, 0
|
||||
kernel_file du 'vmstupid.sys', 0
|
||||
|
||||
handle dd ?
|
||||
system_table dd ?
|
|
@ -1,10 +1,3 @@
|
|||
macro defn name
|
||||
{
|
||||
virtual at 0
|
||||
name name
|
||||
end virtual
|
||||
}
|
||||
|
||||
struc BOOLEAN
|
||||
{
|
||||
. db ?
|
22
boot/loader/Makefile
Normal file
22
boot/loader/Makefile
Normal file
|
@ -0,0 +1,22 @@
|
|||
TARGET = stpdldr.sys
|
||||
|
||||
LOADER_SRCS = loader.asm \
|
||||
../common/const.inc \
|
||||
a20.inc \
|
||||
multiboot.inc
|
||||
|
||||
.PHONY: all
|
||||
all: $(TARGET)
|
||||
|
||||
|
||||
stpdldr.sys: $(LOADER_SRCS)
|
||||
$(AS) loader.asm $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) $(TARGET)
|
||||
|
||||
.PHONY: install
|
||||
install: $(TARGET)
|
||||
@ mkdir -p $(DESTDIR)
|
||||
install $(TARGET) $(DESTDIR)
|
|
@ -1,12 +1,14 @@
|
|||
INCLUDE 'const.inc'
|
||||
INCLUDE 'multiboot.inc'
|
||||
format binary
|
||||
|
||||
ORG STAGE1_BASE
|
||||
USE32
|
||||
include '../common/const.inc'
|
||||
include 'multiboot.inc'
|
||||
|
||||
org LOADER_BASE
|
||||
use32
|
||||
|
||||
jmp _start
|
||||
|
||||
ALIGN 4
|
||||
align 4
|
||||
multiboot_header:
|
||||
mb_header MultibootHeader multiboot_header
|
||||
|
||||
|
@ -14,7 +16,7 @@ _start:
|
|||
cmp eax, MULTIBOOT_MAGIC
|
||||
je .multiboot
|
||||
|
||||
USE16
|
||||
use16
|
||||
;; non multiboot process
|
||||
push cs
|
||||
pop ds
|
||||
|
@ -46,16 +48,15 @@ _start:
|
|||
hlt
|
||||
jmp $
|
||||
|
||||
INCLUDE 'a20.inc'
|
||||
INCLUDE 'utils.inc'
|
||||
INCLUDE 'memory.inc'
|
||||
INCLUDE 'video.inc'
|
||||
include 'a20.inc'
|
||||
include '../common/bios.inc'
|
||||
include 'memory.inc'
|
||||
include 'video.inc'
|
||||
|
||||
msg_stage2 db "StupidOS Bootloader (Stage 1)", CR, LF, 0
|
||||
msg_error_a20 db "ERROR: can't enable a20 line", CR, LF, 0
|
||||
msg_error_memory db "ERROR: can't detect available memory", CR, LF, 0
|
||||
|
||||
|
||||
;;
|
||||
bi_screen_width: dw 0
|
||||
bi_screen_height: dw 0
|
|
@ -15,7 +15,7 @@ struc MultibootHeader addr
|
|||
|
||||
; address fields (we'll just skip them)
|
||||
.header_addr dd addr
|
||||
.load_addr dd STAGE1_BASE
|
||||
.load_addr dd LOADER_BASE
|
||||
.load_end_addr dd _edata
|
||||
.bss_end_addr dd _end
|
||||
.entry_addr dd _start
|
||||
|
@ -106,3 +106,11 @@ MULTIBOOT_MEMORY_RESERVED = 0x2
|
|||
MULTIBOOT_MEMORY_ACPI = 0x3
|
||||
MULTIBOOT_MEMORY_NVS = 0x4
|
||||
MULTIBOOT_MEMORY_BADPARAM = 0x5
|
||||
|
||||
struc MultibootModule
|
||||
{
|
||||
.mod_start dd ?
|
||||
.mod_end dd ?
|
||||
.cmdline dd ?
|
||||
.pad dd ?
|
||||
}
|
|
@ -5,7 +5,7 @@ TOPGOALS = all clean install
|
|||
.PHONY: $(SUBDIRS)
|
||||
$(SUBDIRS):
|
||||
@echo "📁 lib/$@"
|
||||
DESTDIR=$(DESTDIR)/lib $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
@DESTDIR=$(DESTDIR)/lib $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
|
||||
.PHONY: $(TOPGOALS)
|
||||
$(TOPGOALS): $(SUBDIRS)
|
||||
|
|
|
@ -17,3 +17,6 @@ coff-ld$(EXEXT): coff-ld.c
|
|||
|
||||
.PHONY: install
|
||||
install: $(TARGET)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
|
|
|
@ -8,7 +8,7 @@ set default=0
|
|||
menuentry "StupidOS" {
|
||||
echo "verify system integrity"
|
||||
hashsum --hash sha256 --check /boot/hashfile --prefix /
|
||||
multiboot /stpdboot.sys
|
||||
multiboot /stpdldr.sys
|
||||
module /vmstupid.sys
|
||||
boot
|
||||
}
|
||||
|
@ -21,9 +21,9 @@ gen_iso_file() {
|
|||
echo "$grub_config" > "$2/boot/grub/grub.cfg"
|
||||
(cd "$2";
|
||||
sha256sum -b -t "vmstupid.sys" > "boot/hashfile";
|
||||
sha256sum -b -t "stpdboot.sys" >> "boot/hashfile"
|
||||
sha256sum -b -t "stpdldr.sys" >> "boot/hashfile"
|
||||
)
|
||||
grub-file --is-x86-multiboot "$2/stpdboot.sys" || exit 1
|
||||
grub-file --is-x86-multiboot "$2/stpdldr.sys" || exit 1
|
||||
|
||||
grub-mkrescue -o $1 $2
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue