From 33bc3446d237a95f1bbf9d5d70a170fa4c4241cd Mon Sep 17 00:00:00 2001 From: EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> Date: Mon, 6 May 2024 23:00:36 -0400 Subject: Improved makefile a bit more and got it working with the other files --- kernel/arch/x86_64/limine.cpp | 6 ++-- kernel/arch/x86_64/limine.h | 2 +- kernel/arch/x86_64/linker.ld | 78 +++++++++++++++++++++++++++++++++++++++++++ kernel/dev/ps2kbd.cpp | 34 +++++++++---------- kernel/kernel.cpp | 6 ++-- kernel/makefile | 68 ++++++++++++++++++------------------- 6 files changed, 136 insertions(+), 58 deletions(-) create mode 100644 kernel/arch/x86_64/linker.ld (limited to 'kernel') 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 #include #include #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(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 -#include -#include +//#include +//#include #include // 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 -#include -#include -#include +//#include +//#include +//#include //#include //#include 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) - -OBJECTS := $(patsubst %.c,%.o,$(C_SOURCES)) -OBJECTS += $(patsubst %.cpp,%.o,$(CPP_SOURCES)) -OBJECTS += $(patsubst %.asm,%.o,$(ASMFILES)) - -DEPFILES := $(patsubst %.c,%.d,$(C_SOURCES)) -DEPFILES += $(patsubst %.cpp,%.d,$(CPP_SOURCES)) - -LINKLST := crti.o -LINKLST += $(CRTBEGIN) -LINKLST += $(OBJECTS) +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') + +#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_SRCS)) + +# 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 -- cgit v1.2.3-70-g09d2