diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | Makefile | 77 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | bootstrap/Makefile | 39 | ||||
-rw-r--r-- | bootstrap/stage1/Makefile | 57 | ||||
-rw-r--r-- | bootstrap/stage1/arch/x86_64/make.conf | 27 | ||||
-rw-r--r-- | bootstrap/stage1/firmware/efi/make.conf | 14 | ||||
-rw-r--r-- | bootstrap/stage2/Makefile | 34 | ||||
-rw-r--r-- | bootstrap/stage2/arch/x86_64/linker.ld | 21 | ||||
-rw-r--r-- | bootstrap/stage2/arch/x86_64/make.conf | 5 | ||||
-rw-r--r-- | bootstrap/stage2/init/init.c | 37 | ||||
-rw-r--r-- | common.mk | 26 | ||||
-rw-r--r-- | patterns.mk | 36 |
13 files changed, 324 insertions, 59 deletions
@@ -6,11 +6,13 @@ *.c.* *.d *.dwo +*.efi *.elf *.gz *.i *.img *.iso +*.lib *.ll *.lst *.lzma @@ -40,6 +42,8 @@ bin/pwd/pwd bin/sh/sh bin/su/su bin/touch/touch +bootstrap/stage1/bootstrap-stage1 +bootstrap/stage2/bootstrap-stage2 kernel/vmbox sbin/init/init sbin/mknod/mknod @@ -1,69 +1,36 @@ +# Copyright (C) 2025 Danny Holman <dholman@gymli.org> +# +# This file is part of BoxOS, a free and open-source Unix-like operating +# system. +# +# BoxOS is free software; you can redistribute it and/or modify under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# BoxOS; if not, see <https://www.gnu.org/licenses/>. + VERSION:=$(shell git describe --abbrev=4 --dirty --always --tags) ROOTDIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))/ -SYS_INCLUDE:=-I$(ROOTDIR)include + include build.conf -export ARCH VERSION ROOTDIR DESTDIR SYS_INCLUDE CC LD +VERSION:=$(addsuffix $(LOCAL_VER), $(VERSION)) +export VERSION ROOTDIR DESTDIR SUBDIRS:=bootstrap \ - kernel \ -.PHONY: all clean modules install install-headers $(SUBDIRS) +.PHONY: all clean install $(SUBDIRS) all: $(SUBDIRS) -subdirs: $(SUBDIRS) - $(SUBDIRS): $(MAKE) -j $(JOBS) $(MAKECMDGOALS) -C $@ clean: $(SUBDIRS) - $(RM) -r $(DESTDIR) $(DESTDIR).tar.zst - -create-basedir: - install -d -m 0755 $(DESTDIR) - install -d -m 0755 $(DESTDIR)/bin - install -d -m 0755 $(DESTDIR)/boot - install -d -m 0755 $(DESTDIR)/etc - install -d -m 0755 $(DESTDIR)/home - install -d -m 0755 $(DESTDIR)/lib - install -d -m 0755 $(DESTDIR)/mnt - install -d -m 0755 $(DESTDIR)/opt - install -d -m 0755 $(DESTDIR)/proc - install -d -m 0755 $(DESTDIR)/root - install -d -m 0755 $(DESTDIR)/sbin - install -d -m 0755 $(DESTDIR)/tmp - install -d -m 0755 $(DESTDIR)/usr - install -d -m 0755 $(DESTDIR)/usr/bin - install -d -m 0755 $(DESTDIR)/usr/include - install -d -m 0755 $(DESTDIR)/usr/lib - install -d -m 0755 $(DESTDIR)/usr/local - install -d -m 0755 $(DESTDIR)/usr/local/bin - install -d -m 0755 $(DESTDIR)/usr/local/include - install -d -m 0755 $(DESTDIR)/usr/local/man - install -d -m 0755 $(DESTDIR)/usr/local/sbin - install -d -m 0755 $(DESTDIR)/usr/local/share - install -d -m 0755 $(DESTDIR)/usr/local/src - install -d -m 0755 $(DESTDIR)/usr/sbin - install -d -m 0755 $(DESTDIR)/usr/share - install -d -m 0755 $(DESTDIR)/usr/src - install -d -m 0755 $(DESTDIR)/var - install -d -m 0755 $(DESTDIR)/var/cache - install -d -m 0755 $(DESTDIR)/var/lib - install -d -m 0755 $(DESTDIR)/var/lock - install -d -m 0755 $(DESTDIR)/var/log - install -d -m 0755 $(DESTDIR)/var/run - install -d -m 0755 $(DESTDIR)/var/tmp - -install: create-basedir subdirs - cp -R etc/* $(DESTDIR)/etc - cp -R usr.share/* $(DESTDIR)/usr/share - tar -cvf $(DESTDIR).tar $(DESTDIR) - zstd $(DESTDIR).tar - $(RM) -r $(DESTDIR) $(DESTDIR).tar - -install-headers: subdirs - cp -R include/* $(DESTDIR)/usr/include - -install-kernel: subdirs -install-modules: subdirs +install: $(SUBDIRS) @@ -3,16 +3,14 @@ Box is a simple Unix-like operating system that runs on the x86_64 architecture. It is written in C with a small portion written in assembly. The kernel, user space and bootstrap loader are all written under the terms of the -GNU General Public License v2. The POSIX-UEFI library that the bootstrap loader -builds against can be found [here](https://gitlab.com/bztsrc/posix-uefi) and is -released under the terms of the MIT License. +GNU General Public License v2. ## Compiling You will need the following to compile the Box kernel: * A working Unix environment -* An x86_64-elf cross compiler +* A working copy of the clang compiler ## Copyright diff --git a/bootstrap/Makefile b/bootstrap/Makefile new file mode 100644 index 0000000..665a26d --- /dev/null +++ b/bootstrap/Makefile @@ -0,0 +1,39 @@ +# Copyright (C) 2025 Danny Holman <dholman@gymli.org> +# +# This file is part of BoxOS, a free and open-source Unix-like operating +# system. +# +# BoxOS is free software; you can redistribute it and/or modify under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# BoxOS; if not, see <https://www.gnu.org/licenses/>. + +include $(ROOTDIR)/build.conf + +ifeq ($(BS_DEBUG),YES) + AFLAGS+=-g + CFLAGS+=-g +endif + +export VERSION ROOTDIR DESTDIR AFLAGS CFLAGS + +SUBDIRS:=stage1 \ + stage2 \ + +.PHONY: all clean install $(SUBDIRS) + +all: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -j $(JOBS) $(MAKECMDGOALS) -C $@ + +clean: $(SUBDIRS) + +install: $(SUBDIRS) diff --git a/bootstrap/stage1/Makefile b/bootstrap/stage1/Makefile new file mode 100644 index 0000000..7c3bf81 --- /dev/null +++ b/bootstrap/stage1/Makefile @@ -0,0 +1,57 @@ +# Copyright (C) 2025 Danny Holman <dholman@gymli.org> +# +# This file is part of BoxOS, a free and open-source Unix-like operating +# system. +# +# BoxOS is free software; you can redistribute it and/or modify under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# BoxOS; if not, see <https://www.gnu.org/licenses/>. + +include $(ROOTDIR)/common.mk + +INCLUDE+=-I$(ARCHDIR)/include -Iinclude -I$(ROOTDIR)kernel/include -I$(ROOTDIR)kernel/arch/$(ARCH)/include +CFLAGS+=-ffreestanding -fno-stack-protector $(BS_OPLVL) + +BINARY=bootstrap-stage1 + +include $(ARCHDIR)/make.conf +FIRMWARE_DIR=firmware/$(FIRMWARE) +include $(FIRMWARE_DIR)/make.conf +COMMON_DIR=firmware/common + +COMMON_OBJS=$(COMMON_DIR)/bprintf.o \ + $(COMMON_DIR)/elf_load.o \ + $(COMMON_DIR)/exception.o \ + $(COMMON_DIR)/rescue.o \ + $(COMMON_DIR)/string.o \ + +OBJS=$(ARCH_OBJS) \ + $(COMMON_OBJS) \ + $(FIRMWARE_OBJS) \ + +.PHONY: all clean install + +all: $(BINARY) + +$(BINARY): $(OBJS) + @$(LD) $(LDFLAGS) $^ + +%.o: %.c + @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE) + @echo [CC] $@ + +%.o: %.s + @$(CC) -c $< -o $@ $(AFLAGS) $(INCLUDE) + +clean: + $(RM) $(BINARY) $(OBJS) $(OBJS:.o=.d) + +-include $(OBJS:.o=.d) diff --git a/bootstrap/stage1/arch/x86_64/make.conf b/bootstrap/stage1/arch/x86_64/make.conf new file mode 100644 index 0000000..ec364c7 --- /dev/null +++ b/bootstrap/stage1/arch/x86_64/make.conf @@ -0,0 +1,27 @@ +# Copyright (C) 2025 Danny Holman <dholman@gymli.org> +# +# This file is part of BoxOS, a free and open-source Unix-like operating +# system. +# +# BoxOS is free software; you can redistribute it and/or modify under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# BoxOS; if not, see <https://www.gnu.org/licenses/>. + +INCLUDE+=-I$(ARCHDIR)/include +AFLAGS+=-target $(ARCH)-pc-win32-coff +CFLAGS+=-mno-red-zone -mno-mmx -mno-sse -mno-sse2 -target $(ARCH)-pc-win32-coff +LDFLAGS+=-entry:_start + +ARCH_OBJS=$(ARCHDIR)/asm/entry.o \ + $(ARCHDIR)/asm/__chkstk.o \ + $(ARCHDIR)/asm/paging.o \ + $(ARCHDIR)/paging.o \ + $(ARCHDIR)/serial.o \ diff --git a/bootstrap/stage1/firmware/efi/make.conf b/bootstrap/stage1/firmware/efi/make.conf new file mode 100644 index 0000000..3b1615e --- /dev/null +++ b/bootstrap/stage1/firmware/efi/make.conf @@ -0,0 +1,14 @@ +LD:=lld-link + +ifeq (BS_DEBUG,YES) + AFLAGS+=-gcodeview + CFLAGS+=-gcodeview +endif + +CFLAGS+=-fshort-wchar +LDFLAGS+=-subsystem:efi_application -out:$(BINARY) + +FIRMWARE_OBJS=$(FIRMWARE_DIR)/efi.o \ + $(FIRMWARE_DIR)/bs_alloc.o \ + $(FIRMWARE_DIR)/tty.o \ + $(FIRMWARE_DIR)/util.o \ diff --git a/bootstrap/stage2/Makefile b/bootstrap/stage2/Makefile new file mode 100644 index 0000000..2b3951d --- /dev/null +++ b/bootstrap/stage2/Makefile @@ -0,0 +1,34 @@ +# Copyright (C) 2025 Danny Holman <dholman@gymli.org> +# +# This file is part of BoxOS, a free and open-source Unix-like operating +# system. +# +# BoxOS is free software; you can redistribute it and/or modify under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# BoxOS; if not, see <https://www.gnu.org/licenses/>. + +include $(ROOTDIR)/common.mk + +ifeq (BS_DEBUG,YES) + AFLAGS+=-g + CFLAGS+=-g +endif + +INCLUDE+=-Iinclude -I$(ROOTDIR)kernel/include +CFLAGS+=-ffreestanding -fno-stack-protector $(BS_OPLVL) + +BINARY=bootstrap-stage2 + +include $(ARCHDIR)/make.conf + +OBJS=$(ARCH_OBJS) \ + +include $(ROOTDIR)/patterns.mk diff --git a/bootstrap/stage2/arch/x86_64/linker.ld b/bootstrap/stage2/arch/x86_64/linker.ld new file mode 100644 index 0000000..7bd0460 --- /dev/null +++ b/bootstrap/stage2/arch/x86_64/linker.ld @@ -0,0 +1,21 @@ +ENTRY(_start) + +SECTIONS { + . = 0x2000; + __bstart = .; + + .text : { + *(.text) + } + + .data : { + *(.data) + } + + .bss : { + *(.bss) + *(COMMON) + } + + __bend = .; +} diff --git a/bootstrap/stage2/arch/x86_64/make.conf b/bootstrap/stage2/arch/x86_64/make.conf new file mode 100644 index 0000000..930b95e --- /dev/null +++ b/bootstrap/stage2/arch/x86_64/make.conf @@ -0,0 +1,5 @@ +AFLAGS+=-target $(ARCH)-none-elf +CFLAGS+=-target $(ARCH)-none-elf -mno-red-zone -mno-mmx -mno-sse -mno-sse2 +LDFLAGS+=--script=$(ARCHDIR)/linker.ld + +ARCH_OBJS=$(ARCHDIR)/asm/entry.o \ diff --git a/bootstrap/stage2/init/init.c b/bootstrap/stage2/init/init.c new file mode 100644 index 0000000..e224e19 --- /dev/null +++ b/bootstrap/stage2/init/init.c @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Danny Holman <dholman@gymli.org> + * + * This file is part of BoxOS, a free and open-source Unix-like operating + * system. + * + * BoxOS is free software; you can redistribute it and/or modify under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * BoxOS; if not, see <https://www.gnu.org/licenses/>. + */ + +#include <sys/memory_map.h> +#include <sys/efi.h> +#include <elf.h> +#include <stdint.h> +#include <string.h> + +char* read_file(const char *filename) { +} + +uintptr_t load_kernel(const char *filename) { + char *buffer; +} + +void parse_cfg(const char *filename) { +} + +int bootstrap_main(mmap_entry_t *mmap, uintptr_t num_entries) { +} diff --git a/common.mk b/common.mk new file mode 100644 index 0000000..0b816ed --- /dev/null +++ b/common.mk @@ -0,0 +1,26 @@ +# Copyright (C) 2025 Danny Holman <dholman@gymli.org> +# +# This file is part of BoxOS, a free and open-source Unix-like operating +# system. +# +# BoxOS is free software; you can redistribute it and/or modify under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# BoxOS; if not, see <https://www.gnu.org/licenses/>. + +include $(ROOTDIR)/build.conf + +INCLUDE+=-I$(ROOTDIR)include +AFLAGS+=-Wall -Wextra -target $(ARCH)-none-elf +CFLAGS+=-Wall -Wextra -std=$(C_VER) -DARCH=\"$(ARCH)\" -DVERSION=\"$(VERSION)\" -target $(ARCH)-none-elf +LDFLAGS+= +LIBS+= + +ARCHDIR=arch/$(ARCH) diff --git a/patterns.mk b/patterns.mk new file mode 100644 index 0000000..1a6b2ce --- /dev/null +++ b/patterns.mk @@ -0,0 +1,36 @@ +# Copyright (C) 2025 Danny Holman <dholman@gymli.org> +# +# This file is part of BoxOS, a free and open-source Unix-like operating +# system. +# +# BoxOS is free software; you can redistribute it and/or modify under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# BoxOS; if not, see <https://www.gnu.org/licenses/>. + +.PHONY: all clean install + +all: $(BINARY) + +$(BINARY): $(OBJS) + @$(LD) $(LDFLAGS) $^ -o $@ + @echo [LD] $@ + +%.o: %.c + @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE) + @echo [CC] $@ + +%.o: %.s + @$(CC) -c $< -o $@ $(AFLAGS) $(INCLUDE) + +clean: + $(RM) $(BINARY) $(OBJS) $(OBJS:.o=.d) $(OBJS:.o=.gcno) + +-include $(OBJS:.o=.d) |