diff options
| author | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2024-05-06 23:00:36 -0400 |
|---|---|---|
| committer | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2024-05-06 23:00:36 -0400 |
| commit | 33bc3446d237a95f1bbf9d5d70a170fa4c4241cd (patch) | |
| tree | 60a07c07c59b92ed21407f59931f25285b89f2aa | |
| parent | 982baec992d48343e455bf6e32ca96fbdcddda01 (diff) | |
Improved makefile a bit more and got it working with the other files
| -rw-r--r-- | kernel/arch/x86_64/limine.cpp | 6 | ||||
| -rw-r--r-- | kernel/arch/x86_64/limine.h | 2 | ||||
| -rw-r--r-- | kernel/arch/x86_64/linker.ld | 78 | ||||
| -rw-r--r-- | kernel/dev/ps2kbd.cpp | 34 | ||||
| -rw-r--r-- | kernel/kernel.cpp | 6 | ||||
| -rw-r--r-- | kernel/makefile | 62 | ||||
| -rw-r--r-- | libc/makefile | 4 | ||||
| -rw-r--r-- | libc/putchar.c | 4 | ||||
| -rw-r--r-- | makefile | 25 | ||||
| -rw-r--r-- | run-qemu.bat | 2 | ||||
| -rw-r--r-- | setup_sysroot.sh | 9 |
11 files changed, 160 insertions, 72 deletions
diff --git a/kernel/arch/x86_64/limine.cpp b/kernel/arch/x86_64/limine.cpp index 84f8642..8c67c52 100644 --- a/kernel/arch/x86_64/limine.cpp +++ b/kernel/arch/x86_64/limine.cpp @@ -1,4 +1,3 @@ -#include <cstddef>
#include <stdint.h>
#include <stddef.h>
#include "limine.h"
@@ -37,6 +36,7 @@ void hcf() { extern void (*__init_array[])();
extern void (*__init_array_end[])();
+extern "C" void kernel_main();
extern "C" void _start() {
if (!LIMINE_BASE_REVISION_SUPPORTED) {
@@ -58,11 +58,13 @@ extern "C" void _start() { limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0];
// Note: we assume the framebuffer model is RGB with 32-bit pixels.
- for (std::size_t i = 0; i < 100; i++) {
+ for (size_t i = 0; i < 100; i++) {
volatile uint32_t *fb_ptr = static_cast<volatile uint32_t *>(framebuffer->address);
fb_ptr[i * (framebuffer->pitch / 4) + i] = 0xffffff;
}
+
+
// We're done, just hang...
hcf();
}
\ No newline at end of file diff --git a/kernel/arch/x86_64/limine.h b/kernel/arch/x86_64/limine.h index 0e7e87a..b4afb43 100644 --- a/kernel/arch/x86_64/limine.h +++ b/kernel/arch/x86_64/limine.h @@ -584,4 +584,4 @@ struct limine_dtb_request { }
#endif
-#endif
\ No newline at end of file +#endif
diff --git a/kernel/arch/x86_64/linker.ld b/kernel/arch/x86_64/linker.ld new file mode 100644 index 0000000..5724ecf --- /dev/null +++ b/kernel/arch/x86_64/linker.ld @@ -0,0 +1,78 @@ +OUTPUT_FORMAT(elf64-x86-64)
+OUTPUT_ARCH(i386:x86-64)
+
+/* Excecution entry point symbol */
+ENTRY(_start)
+
+PHDRS
+{
+ requests PT_LOAD FLAGS((1 << 1) | (1 << 2)); /* Write + Read */
+ text PT_LOAD FLAGS((1 << 0) | (1 << 2)); /* Execute + Read */
+ rodata PT_LOAD FLAGS((1 << 2)); /* Read only */
+ data PT_LOAD FLAGS((1 << 1) | (1 << 2)); /* Write + Read */
+ dynamic PT_DYNAMIC FLAGS((1 << 1) | (1 << 2)); /* Dynamic PHDR for relocations */
+}
+
+SECTIONS
+{
+ /* Places kernel in the top 2GiB of the address space */
+ . = 0xffffffff80000000;
+
+ /* Used to get the beginning and end address of the kernel */
+ __kernel_begin = .;
+
+ .requests : {
+ KEEP(*(.requests_start_marker))
+ KEEP(*(.requests))
+ KEEP(*(.requests_end_marker))
+ } :requests
+
+ . += CONSTANT(MAXPAGESIZE);
+
+ /* code. multiboot header comes first */
+ .text : {
+ *(.text .text.*)
+ } :text
+
+ . += CONSTANT(MAXPAGESIZE);
+
+ /* read only data */
+ .rodata : {
+ *(. .rodata.*)
+ } :rodata
+
+ /* init array symbols used to get start and end address of the array */
+ .init_array : {
+ __init_array = .;
+ *(.init_array .init_array.*)
+ __init_array_end = .;
+ } :rodata
+
+ . += CONSTANT(MAXPAGESIZE);
+
+ /* read write data (initialized) */
+ .data : {
+ *(.data .data.*)
+ } :data
+
+ /* Dynamic section for relocations, both in its own PHDR and inside data PHDR */
+ .dynamic : {
+ *(.dynamic)
+ } :data :dynamic
+
+ . += CONSTANT(MAXPAGESIZE);
+
+ /* read write data (uninitialized) and stack */
+ .bss : {
+ *(.bss .bss.*)
+ *(COMMON)
+ } :data
+
+ /* Discard .note.* and .eh_frame since they may cause issues on some hosts */
+ /DISCARD/ : {
+ *(.eh_frame)
+ *(.note .note.*)
+ }
+
+ __kernel_end = .;
+}
\ No newline at end of file diff --git a/kernel/dev/ps2kbd.cpp b/kernel/dev/ps2kbd.cpp index ee282b6..ffb1189 100644 --- a/kernel/dev/ps2kbd.cpp +++ b/kernel/dev/ps2kbd.cpp @@ -1,25 +1,25 @@ #include <stdint.h>
-#include <stdio.h>
-#include <arch/i386/pic.h>
+//#include <stdio.h>
+//#include <arch/i386/pic.h>
#include <io.h>
// Keycodes are sorted from left to right, up to down starting with esc
// 0x80 is reserved for nonexistant scancodes
// used for scan code set 2
-constexpr uint8_t scancodes[] = {
- 9, 0x80, 5, 3, 1, 2, 12, 0x80,
- 10, 8, 6, 4, 27,
-};
+// constexpr uint8_t scancodes[] = {
+// 9, 0x80, 5, 3, 1, 2, 12, 0x80,
+// 10, 8, 6, 4, 27,
+// };
-void keyboard_init() {
- irq_clear_mask(1);
- outb(0x60, 0xF4);
- inb(0x60);
-}
+// void keyboard_init() {
+// irq_clear_mask(1);
+// outb(0x60, 0xF4);
+// inb(0x60);
+// }
-void keyboard_write(uint8_t scancode) {
- printf("a\n");
- /*for (int i = 0; i < 7; i++) {
- inputbuffer |= inb(PS2_DATA) << (i * 8); // lsb is the first scan code
- }*/
-}
\ No newline at end of file +// void keyboard_write(uint8_t scancode) {
+// printf("a\n");
+// /*for (int i = 0; i < 7; i++) {
+// inputbuffer |= inb(PS2_DATA) << (i * 8); // lsb is the first scan code
+// }*/
+// }
\ No newline at end of file diff --git a/kernel/kernel.cpp b/kernel/kernel.cpp index f8f36b5..a0394ea 100644 --- a/kernel/kernel.cpp +++ b/kernel/kernel.cpp @@ -1,7 +1,7 @@ #include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
+//#include <stddef.h>
+//#include <stdint.h>
+//#include <stdio.h>
//#include <arch/i386/tmtty.h>
//#include <arch/i386/ps2_controller.h>
diff --git a/kernel/makefile b/kernel/makefile index b2a2660..8c2832d 100644 --- a/kernel/makefile +++ b/kernel/makefile @@ -1,14 +1,14 @@ # Kernel makefile
-CFLAGS := -ffreestanding -Wall -Wextra -g -std=gnu99 -O2 -Iinclude
-CXXFLAGS := -ffreestanding -Wall -Wextra -fno-exceptions -fno-rtti -g -O2 -Iinclude
-LDFLAGS := -T arch/$(ARCH)/linker.ld -ffreestanding -g -O2 -Iinclude
+CFLAGS := -ffreestanding -Wall -Wextra -g -std=gnu99 -O2 -Iinclude --sysroot=$(SYSROOT)
+CXXFLAGS := -ffreestanding -Wall -Wextra -fno-exceptions -fno-rtti -g -O2 -Iinclude --sysroot=$(SYSROOT)
+LDFLAGS := -T arch/$(ARCH)/linker.ld -ffreestanding -g -O2 -Iinclude --sysroot=$(SYSROOT)
ASMFLAGS :=
ifeq ($(ARCH),x86_64)
-CFLAGS += -mno-red-zone
-CXXFLAGS += -mno-red-zone
-LDFLAGS += -mno-red-zone
+CFLAGS += -mno-red-zone -mcmodel=kernel -mno-sse -mno-sse2 -mno-mmx
+CXXFLAGS += -mno-red-zone -mcmodel=kernel -mno-sse -mno-sse2 -mno-mmx
+LDFLAGS += -mno-red-zone -mcmodel=kernel -mno-sse -mno-sse2 -mno-mmx
ASMFLAGS += -felf64
endif
@@ -16,38 +16,36 @@ ifndef SYSROOT $(error No sysroot specified)
endif
-
-LIBS = -nostdlib -lck -lgcc
+LIBS = -nostdlib -lc -lgcc
#Find all the source files
-C_SOURCES := $(shell find $(PWD)/kernel -type f -name '*.c')
-CPP_SOURCES := $(shell find $(PWD)/kernel -type f -name '*.cpp')
-HEADERS := $(shell find $(PWD) -type f -name '*.h')
-ASMFILES := $(shell find $(PWD) -type f -name '*.asm' ! -name 'crti.asm' ! -name 'crtn.asm')
-CRTBEGIN := $(shell $(CXX) $(CXXFLAGS) -print-file-name=crtbegin.o)
-CRTEND := $(shell $(CXX) $(CXXFLAGS) -print-file-name=crtend.o)
+CPP_SRCS := $(shell find . -type f -name '*.cpp' -not -path './arch/*') \
+ $(shell find $(PWD)/kernel/arch/$(ARCH) -type f -name '*.cpp')
+#HEADERS := $(shell find $(PWD) -type f -name '*.h')
+#ASMFILES := $(shell find $(PWD) -type f -name '*.asm' -prune $(PWD)/arch) \
+ $(shell find $(PWD)/kernel/arch/$(ARCH) -type f -name '*.asm')
-OBJECTS := $(patsubst %.c,%.o,$(C_SOURCES))
-OBJECTS += $(patsubst %.cpp,%.o,$(CPP_SOURCES))
-OBJECTS += $(patsubst %.asm,%.o,$(ASMFILES))
+#OBJS := $(patsubst %.c,%.o,$(C_SOURCES))
+OBJS := $(patsubst %.cpp,%.o,$(CPP_SRCS))
+OBJS += $(patsubst %.asm,%.o,$(ASMFILES))
-DEPFILES := $(patsubst %.c,%.d,$(C_SOURCES))
-DEPFILES += $(patsubst %.cpp,%.d,$(CPP_SOURCES))
+#DEPFILES := $(patsubst %.c,%.d,$(C_SOURCES))
+DEPFILES := $(patsubst %.cpp,%.d,$(CPP_SRCS))
-LINKLST := crti.o
-LINKLST += $(CRTBEGIN)
-LINKLST += $(OBJECTS)
+# LINKLST := crti.o
+# LINKLST += $(CRTBEGIN)
+LINKLST += $(OBJS)
LINKLST += $(LIBS)
-LINKLST += $(CRTEND)
-LINKLST += crtn.o
+# LINKLST += $(CRTEND)
+# LINKLST += crtn.o
-include $(DEPFILES)
-.PHONY: all crt clean kernel.bin
+.PHONY: all clean
-all: crti.o crtn.o kernel.bin
+all: kernel.bin
-kernel.bin: ${OBJECTS}
+kernel.bin: ${OBJS}
$(info [INFO] Linking kernel)
$(CXX) ${LDFLAGS} -o $@ $(LINKLST)
@@ -63,15 +61,15 @@ kernel.bin: ${OBJECTS} $(info [INFO] Assembling $<)
$(NASM) $< $(ASMFLAGS) -o $@ -g
-crti.o:
- $(NASM) arch/$(ARCH)/crti.asm $(ASMFLAGS) -o $@
+# crti.o:
+# $(NASM) arch/$(ARCH)/crti.asm $(ASMFLAGS) -o $@
-crtn.o:
- $(NASM) arch/$(ARCH)/crtn.asm $(ASMFLAGS) -o $@
+# crtn.o:
+# $(NASM) arch/$(ARCH)/crtn.asm $(ASMFLAGS) -o $@
install-headers:
cp -r --preserve=timestamps include/. $(SYSROOT)/usr/include
clean:
$(info [INFO] Cleaning)
- $(RM) ${OBJECTS} $(DEPFILES) crti.o crtn.o
\ No newline at end of file + $(RM) ${OBJS} $(DEPFILES)
\ No newline at end of file diff --git a/libc/makefile b/libc/makefile index 2e1912e..560efb7 100644 --- a/libc/makefile +++ b/libc/makefile @@ -1,4 +1,4 @@ -# libck makefile
+# libc makefile
ifndef AR
AR = i686-elf-ar
@@ -71,7 +71,7 @@ libc.a: ${OBJECTS} install-headers:
cp -r --preserve=timestamps include/. $(SYSROOT)/usr/include
-install-lib: libck.a
+install-lib: libc.a
cp -r $< $(SYSROOT)/usr/lib/.
clean:
diff --git a/libc/putchar.c b/libc/putchar.c index c5a7976..48147bf 100644 --- a/libc/putchar.c +++ b/libc/putchar.c @@ -1,9 +1,9 @@ #include <stdio.h>
-#include <arch/i386/tmtty.h>
+//#include <arch/i386/tmtty.h>
int putchar(int ic) {
char c = (char) ic;
- terminal_write(&c, sizeof(c));
+ //terminal_write(&c, sizeof(c));
return ic;
}
\ No newline at end of file @@ -1,24 +1,24 @@ # The makefile
-OS_NAME := emuos
-ARCH ?= x86_64
-export SYSROOT = $(PWD)/sysroot
+OS_NAME := emuos
+export ARCH ?= x86_64
+export SYSROOT = $(PWD)/sysroot
# Variables for easy access of tools like gcc and nasm
export CC = $(ARCH)-elf-gcc
export CXX = $(ARCH)-elf-g++
export AR = $(ARCH)-elf-ar
export NASM = nasm
-QEMU = qemu-system-x86_64
+QEMU = qemu-system-$(ARCH)
#ASMFLAGS = -felf32
#CXXFLAGS := -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti
#LDFLAGS := -ffreestanding -O2 -nostdlib
-.PHONY: all grub clean build-all
+.PHONY: all limine clean build-all
-all: build-all grub
+all: build-all limine
-build-all: kernel/kernel.bin libc.a
+build-all: kernel/kernel.bin libc/libc.a
libc/libc.a: install-headers
$(info [INFO] Building libc)
@@ -28,26 +28,27 @@ kernel/kernel.bin: libc/libc.a install-headers $(info [INFO] Building kernel)
$(MAKE) -C ./kernel/ ARCH=$(ARCH) PREFIX=$(PWD)
-grub: build-all grub.cfg
+limine: build-all
+ cp kernel/kernel.bin isodir/boot
xorriso -as mkisofs -b boot/limine/limine-bios-cd.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
--efi-boot boot/limine/limine-uefi-cd.bin \
-efi-boot-part --efi-boot-image --protective-msdos-label \
isodir -o emuos.iso
-qemu: grub
+qemu: limine
$(QEMU) -no-shutdown -no-reboot --serial stdio -s -m 512 -hda $(OS_NAME).iso
install: install-headers install-libraries
install-headers:
$(MAKE) -C ./kernel/ install-headers
- $(MAKE) -C ./libs/libc/ install-headers
+ $(MAKE) -C ./libc/ install-headers
install-libraries:
- $(MAKE) -C ./libs/libc/ install-lib
+ $(MAKE) -C ./libc/ install-lib
clean:
-@$(MAKE) -C ./kernel/ clean
- -@$(MAKE) -C ./libs/libc/ clean
+ -@$(MAKE) -C ./libc/ clean
-@$(RM) $(wildcard *.bin *.a)
diff --git a/run-qemu.bat b/run-qemu.bat index 19a5ae8..ddf7afa 100644 --- a/run-qemu.bat +++ b/run-qemu.bat @@ -1,2 +1,2 @@ @echo off
-qemu-system-i386 -m 128 -drive format=raw,media=cdrom,file=emuos.iso
\ No newline at end of file +qemu-system-x86_64 -m 128 -drive format=raw,media=cdrom,file=emuos.iso
\ No newline at end of file diff --git a/setup_sysroot.sh b/setup_sysroot.sh new file mode 100644 index 0000000..5c48677 --- /dev/null +++ b/setup_sysroot.sh @@ -0,0 +1,9 @@ +# Copies include/ header files to sysroot/ + +# creates the needed sysroot folders if non existant +mkdir -p sysroot/usr/include +mkdir -p sysroot/usr/lib + +# copies all needed header files for compiling +cp -r kernel/include/* sysroot/usr/include +cp -r libc/include/* sysroot/usr/include
\ No newline at end of file |
