diff --git a/Makefile b/Makefile index 3e9ad1d..9237a55 100644 --- a/Makefile +++ b/Makefile @@ -1,66 +1,66 @@ -.EXPORT_ALL_VARIABLES: - -TOPDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) -SYSROOTDIR := $(TOPDIR)/sysroot -TOOLSDIR := $(TOPDIR)/tools - -RM = echo - -MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\" -MK_COMMIT := \"$(shell git rev-parse --short HEAD)\" - -SUBDIRS := tools boot kernel lib bin - -TARGET = stupid.tar.gz floppy_boot.img -ifneq ($(OS),Windows_NT) -EXEXT = -TARGET += stupid.iso stdupid.hdd -else -EXEXT = .exe -endif - -.PHONY: all -all: $(TARGET) - -GOAL:=install -clean: GOAL:=clean - -.PHONY: $(SUBDIRS) -$(SUBDIRS): - @echo "📁 $@" - DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL) - -.PHONY: stupid.iso -stupid.iso: $(SUBDIRS) - $(TOPDIR)/tools/create-iso $@ sysroot - -.PHONY: stupid.hdd -stupid.hdd: $(SUBDIRS) - @echo "" - -.PHONY: stupid.tar.gz -stupid.tar.gz: $(SUBDIRS) - tar -czvf $@ sysroot - -.PHONY: floppy_boot.img -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 - mcopy -i $@ kernel/vmstupid.sys ::/VMSTUPID.SYS - -.PHONY: run -run: all - qemu-system-i386 \ - -rtc base=localtime \ - -drive file=floppy_boot.img,if=none,format=raw,id=boot \ - -drive file=fat:rw:./sysroot,if=none,id=hdd \ - -device floppy,drive=boot \ - -device ide-hd,drive=hdd \ - -global isa-fdc.bootindexA=0 \ - -serial mon:stdio - -.PHONY: clean -clean: $(SUBDIRS) - $(RM) $(TARGET) $(SYSROOTDIR) +.EXPORT_ALL_VARIABLES: + +TOPDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) +SYSROOTDIR := $(TOPDIR)/sysroot +TOOLSDIR := $(TOPDIR)/tools + +RM = echo + +MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\" +MK_COMMIT := \"$(shell git rev-parse --short HEAD)\" + +SUBDIRS := tools boot kernel lib bin + +TARGET = stupid.tar.gz floppy_boot.img +ifneq ($(OS),Windows_NT) +EXEXT = +TARGET += stupid.iso stupid.hdd +else +EXEXT = .exe +endif + +.PHONY: all +all: $(TARGET) + +GOAL:=install +clean: GOAL:=clean + +.PHONY: $(SUBDIRS) +$(SUBDIRS): + @echo "📁 $@" + DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL) + +.PHONY: stupid.iso +stupid.iso: $(SUBDIRS) + $(TOPDIR)/tools/create-iso $@ sysroot + +.PHONY: stupid.hdd +stupid.hdd: $(SUBDIRS) + @echo "" + +.PHONY: stupid.tar.gz +stupid.tar.gz: $(SUBDIRS) + tar -czvf $@ sysroot + +.PHONY: floppy_boot.img +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 + mcopy -i $@ kernel/vmstupid.sys ::/VMSTUPID.SYS + +.PHONY: run +run: all + qemu-system-i386 \ + -rtc base=localtime \ + -drive file=floppy_boot.img,if=none,format=raw,id=boot \ + -drive file=fat:rw:./sysroot,if=none,id=hdd \ + -device floppy,drive=boot \ + -device ide-hd,drive=hdd \ + -global isa-fdc.bootindexA=0 \ + -serial mon:stdio + +.PHONY: clean +clean: $(SUBDIRS) + $(RM) $(TARGET) $(SYSROOTDIR) diff --git a/boot/boot0.asm b/boot/boot0.asm index 144110d..7468a24 100644 --- a/boot/boot0.asm +++ b/boot/boot0.asm @@ -1,120 +1,120 @@ - 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 + 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 diff --git a/boot/boot1.asm b/boot/boot1.asm index f1bddf0..221621e 100644 --- a/boot/boot1.asm +++ b/boot/boot1.asm @@ -1,65 +1,68 @@ - INCLUDE 'const.inc' - INCLUDE 'multiboot.inc' - - ORG STAGE1_BASE - USE16 - - jmp _start - - mb_header MultibootHeader mb_header - -_start: - cmp eax, MULTIBOOT_MAGIC - je .multiboot - - ;; non multiboot process - push cs - pop ds - - mov si, msg_stage2 - call bios_print - - call a20_enable - jc .error_a20 - - ; detect memory - call memory_get_map - jc .error_memory - xchg bx, bx - - call video_setup - -.multiboot: - jmp .hang - -.error_memory: - mov si, msg_error_memory - jmp .error -.error_a20: - mov si, msg_error_a20 -.error: - call bios_print -.hang: - hlt - jmp $ - - INCLUDE 'a20.inc' - INCLUDE 'utils.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 - -_edata: - - ; BSS - rb 0x4000 - -_end: + INCLUDE 'const.inc' + INCLUDE 'multiboot.inc' + + ORG STAGE1_BASE + USE32 + + jmp _start + + ALIGN 4 +multiboot_header: + mb_header MultibootHeader multiboot_header + +_start: + cmp eax, MULTIBOOT_MAGIC + je .multiboot + + USE16 + ;; non multiboot process + push cs + pop ds + + mov si, msg_stage2 + call bios_print + + call a20_enable + jc .error_a20 + + ; detect memory + call memory_get_map + jc .error_memory + xchg bx, bx + + call video_setup + +.multiboot: + jmp .hang + +.error_memory: + mov si, msg_error_memory + jmp .error +.error_a20: + mov si, msg_error_a20 +.error: + call bios_print +.hang: + hlt + jmp $ + + INCLUDE 'a20.inc' + INCLUDE 'utils.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 + +_edata: + + ; BSS + rb 0x4000 + +_end: diff --git a/boot/const.inc b/boot/const.inc index a52a058..b053e62 100644 --- a/boot/const.inc +++ b/boot/const.inc @@ -1,14 +1,15 @@ -CR = 0x0D -LF = 0x0A - -; -------- Address ---------- -STAGE0_BASE = 0x7C00 -STAGE1_BASE = 0x1000 -DISK_BUFFER = 0x8000 -KERNEL_PRELOAD = 0xF000 -STACK_TOP = 0x7000 - -; ---------- Video ------------ -VIDEO_WIDTH = 1024 -VIDEO_HEIGHT = 768 -VIDEO_DEPTH = 32 +CR = 0x0D +LF = 0x0A + +; -------- Address ---------- +STAGE0_BASE = 0x7C00 +STAGE1_BASE = 0x1000 +MULTIBOOT_BASE = 0x100000 +DISK_BUFFER = 0x8000 +KERNEL_PRELOAD = 0xF000 +STACK_TOP = 0x7000 + +; ---------- Video ------------ +VIDEO_WIDTH = 1024 +VIDEO_HEIGHT = 768 +VIDEO_DEPTH = 32 diff --git a/boot/multiboot.inc b/boot/multiboot.inc index 299a39b..fff67db 100644 --- a/boot/multiboot.inc +++ b/boot/multiboot.inc @@ -1,107 +1,108 @@ -MULTIBOOT_HDR_MAGIC = 0x1BADB002 -MULTIBOOT_MAGIC = 0x2BADB002 - -MULTIBOOT_HDR_ALIGN = 0x1 -MULTIBOOT_HDR_MEMINFO = 0x2 -MULTIBOOT_HDR_VIDEO = 0x4 -MULTIBOOT_FLAGS = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO - -struc MultibootHeader addr -{ - .magic dd MULTIBOOT_HDR_MAGIC - .flags dd MULTIBOOT_FLAGS - .checksum dd -(MULTIBOOT_HDR_MAGIC + MULTIBOOT_FLAGS) - - ; address fields (we'll just skip them) - .header_addr dd addr - .load_addr dd STAGE1_BASE - .load_end_addr dd _edata - STAGE1_BASE - .bss_end_addr dd _end - STAGE1_BASE - .entry_addr dd _start - - ; Video mode - .mode_type dd 0x0 - .width dd VIDEO_WIDTH - .height dd VIDEO_HEIGHT - .depth dd VIDEO_DEPTH -} - -struc MultibootData -{ - .flags dd ? - - ; if flags[0] is set - .mem_lower dd ? - .mem_upper dd ? - - ; if flags[1] is set - .boot_device dd ? - - ; if flags[2] is set - .cmdline dd ? - - ; if flags[3] is set - .mods_count dd ? - .mods_addr dd ? - - ; if flags[4] is set - .syms dd 4 dup ? - - ; if flags[6] is set - .mmap_length dd ? - .mmap_addr dd ? - - ; if flags[7] is set - .drives_length dd ? - .drives_addr dd ? - - ; if flags[8] is set - .config_table dd ? - - ; if flags[9] is set - .bootloader_name dd ? - - ; if flags[10] is set - .apm_table dd ? - - ; if flags[11] is set - .vbe_control_info dd ? - .vbe_mode_info dd ? - .vbe_mode dw ? - .vbe_if_seg dw ? - .vbe_if_off dw ? - .vbe_if_length dw ? - - ; if flags[12] is set - .fb_addr dq ? - .fb_pitch dd ? - .fb_width dd ? - .fb_height dd ? - .fb_bpp db ? - .fb_type db ? - .fb_misc dw 3 dup ? -} - -MULTIBOOT_DATA_MEM = 0x0001 -MULTIBOOT_DATA_BOOTDEV = 0x0002 -MULTIBOOT_DATA_CMDLINE = 0x0004 -MULTIBOOT_DATA_MODULES = 0x0008 -MULTIBOOT_DATA_MMAP = 0x0040 -MULTIBOOT_DATA_DRIVES = 0x0080 -MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200 -MULTIBOOT_DATA_VBE = 0x0800 -MULTIBOOT_DATA_FB = 0x1000 - -struc MultibootMMap -{ - .size dd ? - .addr dq ? - .length dq ? - .type dd ? -} - -MULTIBOOT_MEMORY_AVAILABLE = 0x1 -MULTIBOOT_MEMORY_RESERVED = 0x2 -MULTIBOOT_MEMORY_ACPI = 0x3 -MULTIBOOT_MEMORY_NVS = 0x4 -MULTIBOOT_MEMORY_BADPARAM = 0x5 +MULTIBOOT_HDR_MAGIC = 0x1BADB002 +MULTIBOOT_MAGIC = 0x2BADB002 + +MULTIBOOT_HDR_ALIGN = 0x1 +MULTIBOOT_HDR_MEMINFO = 0x2 +MULTIBOOT_HDR_VIDEO = 0x4 +MULTIBOOT_HDR_AOUT_KLUDGE = 0x10000 +MULTIBOOT_FLAGS = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO or MULTIBOOT_HDR_AOUT_KLUDGE + +struc MultibootHeader addr +{ + .magic dd MULTIBOOT_HDR_MAGIC + .flags dd MULTIBOOT_FLAGS + .checksum dd -(MULTIBOOT_HDR_MAGIC + MULTIBOOT_FLAGS) + + ; address fields (we'll just skip them) + .header_addr dd addr + .load_addr dd STAGE1_BASE + .load_end_addr dd _edata + .bss_end_addr dd _end + .entry_addr dd _start + + ; Video mode + .mode_type dd 0x0 + .width dd VIDEO_WIDTH + .height dd VIDEO_HEIGHT + .depth dd VIDEO_DEPTH +} + +struc MultibootData +{ + .flags dd ? + + ; if flags[0] is set + .mem_lower dd ? + .mem_upper dd ? + + ; if flags[1] is set + .boot_device dd ? + + ; if flags[2] is set + .cmdline dd ? + + ; if flags[3] is set + .mods_count dd ? + .mods_addr dd ? + + ; if flags[4] is set + .syms dd 4 dup ? + + ; if flags[6] is set + .mmap_length dd ? + .mmap_addr dd ? + + ; if flags[7] is set + .drives_length dd ? + .drives_addr dd ? + + ; if flags[8] is set + .config_table dd ? + + ; if flags[9] is set + .bootloader_name dd ? + + ; if flags[10] is set + .apm_table dd ? + + ; if flags[11] is set + .vbe_control_info dd ? + .vbe_mode_info dd ? + .vbe_mode dw ? + .vbe_if_seg dw ? + .vbe_if_off dw ? + .vbe_if_length dw ? + + ; if flags[12] is set + .fb_addr dq ? + .fb_pitch dd ? + .fb_width dd ? + .fb_height dd ? + .fb_bpp db ? + .fb_type db ? + .fb_misc dw 3 dup ? +} + +MULTIBOOT_DATA_MEM = 0x0001 +MULTIBOOT_DATA_BOOTDEV = 0x0002 +MULTIBOOT_DATA_CMDLINE = 0x0004 +MULTIBOOT_DATA_MODULES = 0x0008 +MULTIBOOT_DATA_MMAP = 0x0040 +MULTIBOOT_DATA_DRIVES = 0x0080 +MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200 +MULTIBOOT_DATA_VBE = 0x0800 +MULTIBOOT_DATA_FB = 0x1000 + +struc MultibootMMap +{ + .size dd ? + .addr dq ? + .length dq ? + .type dd ? +} + +MULTIBOOT_MEMORY_AVAILABLE = 0x1 +MULTIBOOT_MEMORY_RESERVED = 0x2 +MULTIBOOT_MEMORY_ACPI = 0x3 +MULTIBOOT_MEMORY_NVS = 0x4 +MULTIBOOT_MEMORY_BADPARAM = 0x5 diff --git a/tools/create-iso b/tools/create-iso index c6f5355..d2a1dcd 100755 --- a/tools/create-iso +++ b/tools/create-iso @@ -8,7 +8,8 @@ set default=0 menuentry "StupidOS" { echo "verify system integrity" hashsum --hash sha256 --check /boot/hashfile --prefix / - multiboot /vmstupid + multiboot /stpdboot.sys + module /vmstupid.sys boot } @@ -18,7 +19,10 @@ EOF gen_iso_file() { mkdir -p "$2/boot/grub" echo "$grub_config" > "$2/boot/grub/grub.cfg" - sha256sum "$2/vmstupid" > "$2/boot/hashfile" + sha256sum "$2/vmstupid.sys" > "$2/boot/hashfile" + sha256sum "$2/stpdboot.sys" >> "$2/boot/hashfile" + + grub-file --is-x86-multiboot "$2/stpdboot.sys" || exit 1 grub-mkrescue -o $1 $2 }