diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c6a3e97..674f4a2 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -27,10 +27,10 @@ //////////////////////////////////// // Linux Setup (X11) //////////////////////////////////// - //"mounts": [ - //"source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached", - //], - //"containerEnv": {}, + "mounts": [ + "source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached" + ], + "containerEnv": {}, //////////////////////////////////// diff --git a/.gitignore b/.gitignore index db0dddf..f01c542 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ build.ninja 00_per_arne src/group_name/src/kernel.c +*.pdf \ No newline at end of file diff --git a/build/group_name/disk.iso b/build/group_name/disk.iso new file mode 100644 index 0000000..ca7780d Binary files /dev/null and b/build/group_name/disk.iso differ diff --git a/build/group_name/kernel.bin b/build/group_name/kernel.bin new file mode 100644 index 0000000..000ec00 Binary files /dev/null and b/build/group_name/kernel.bin differ diff --git a/build/group_name/kernel.iso b/build/group_name/kernel.iso new file mode 100644 index 0000000..fac34b2 Binary files /dev/null and b/build/group_name/kernel.iso differ diff --git a/src/OSDev_18/src/kernel.c b/src/OSDev_18/src/kernel.c new file mode 100644 index 0000000..e69de29 diff --git a/src/group_name/CMakeLists.txt b/src/group_name/CMakeLists.txt new file mode 100644 index 0000000..e7d725d --- /dev/null +++ b/src/group_name/CMakeLists.txt @@ -0,0 +1,137 @@ +######################################## +# The University of Agder Operating System: UiAOS +# Languages: C, C++, and NASM Assembly +# Tip: Use Ctrl+Shift+P in Visual Studio Code to get started with CMake. +######################################## + +# Skip compiler self-tests (saves time, avoids errors with some cross compilers) +set(CMAKE_C_COMPILER_WORKS 1) +set(CMAKE_CXX_COMPILER_WORKS 1) + +# Minimum required CMake version +cmake_minimum_required(VERSION 3.22.1) + +# Project name and languages used +project(UiAOS LANGUAGES C CXX ASM_NASM) + +# Create a lock file to prevent parallel runs of CMake +file(LOCK ${CMAKE_SOURCE_DIR} DIRECTORY GUARD FILE) + +######################################## +# CMake: Import Plugins +######################################## +include(FetchContent) + +######################################## +# UiAOS: Variables +######################################## +set(OS_ARCH_TARGET "i386") # x86_64 +set(OS_NAME "UiA Operating System") +set(OS_KERNEL_NAME "uiaos") +set(OS_KERNEL_BINARY "kernel.bin") +set(OS_KERNEL_IMAGE "kernel.iso") + +######################################## +# Compiler Configuration +######################################## +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_C_STANDARD 99) + +######################################## +# Assembly Configuration +######################################## +set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS "s;S;asm") +if(OS_ARCH_TARGET STREQUAL "i386") + set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf32") +elseif(OS_ARCH_TARGET STREQUAL "x86_64") + set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf64") +endif() + +# Command to compile NASM files +set(CMAKE_ASM_NASM_COMPILE_OBJECT + " -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o ") + +######################################## +# OS Target +######################################## +set(OS_KERNEL_LINKER "${CMAKE_CURRENT_SOURCE_DIR}/src/arch/${OS_ARCH_TARGET}/linker.ld") + +# Add executable target for the kernel +add_executable(uiaos-kernel + # src/multiboot2.asm # TODO: Add multiboot2 support + src/kernel.c +) + +# Include directories for the kernel target +target_include_directories(uiaos-kernel PUBLIC include) + + +# Specify compile options for C and C++ +target_compile_options(uiaos-kernel PRIVATE + $<$:-Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -Wno-main -g> + $<$:-Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -g> + $<$,$>:-m32 -march=i386 -Wno-unused-variable -Wno-unused-parameter> +) + + +# Specify link options for C and C++ +target_link_options(uiaos-kernel PUBLIC + $<$,$>:-ffreestanding -nostdlib -fno-builtin -static -pie -O0 -T${OS_KERNEL_LINKER} -g> +) + + +target_link_options( + uiaos-kernel + PUBLIC "-ffreestanding" + PUBLIC "-nostdlib" + PUBLIC "-static" + PUBLIC "-pie" + PUBLIC "-T${OS_KERNEL_LINKER}" +) + + +# Set properties for the kernel target +set_target_properties(uiaos-kernel PROPERTIES + OUTPUT_NAME "${OS_KERNEL_BINARY}" + #LINK_FLAGS "${OS_KERNEL_LINK_FLAGS}" +) + +######################################## +# Create Empty Fat32 Disk Image +######################################## +set(DISK_IMAGE "${CMAKE_CURRENT_BINARY_DIR}/disk.iso") + +# Custom target to create an empty FAT32 disk image of 32MB +add_custom_target( + create-fat32-disk + COMMAND dd if=/dev/zero of=${DISK_IMAGE} bs=1M count=32 + COMMAND mkfs.fat -F 32 ${DISK_IMAGE} + VERBATIM +) + +######################################## +# OS-Image Target +######################################## +set(ISO_DIR ${CMAKE_CURRENT_BINARY_DIR}/iso) +set(LIMINE_CONFIG_DIR ${CMAKE_SOURCE_DIR}) +set(LIMINE_DIR /usr/local/limine) +add_custom_target( + uiaos-create-image + COMMAND rm -rf ${ISO_DIR} + COMMAND mkdir -p ${ISO_DIR} + COMMAND cp -v $ + ${LIMINE_CONFIG_DIR}/limine.cfg ${LIMINE_DIR}/limine-bios.sys ${LIMINE_DIR}/limine-bios-cd.bin + ${LIMINE_DIR}/limine-uefi-cd.bin ${ISO_DIR}/ + COMMAND mkdir -p ${ISO_DIR}/EFI/BOOT + COMMAND cp -v ${LIMINE_DIR}/BOOTX64.EFI ${ISO_DIR}/EFI/BOOT/ + COMMAND cp -v ${LIMINE_DIR}/BOOTIA32.EFI ${ISO_DIR}/EFI/BOOT/ + COMMAND xorriso -as mkisofs -b limine-bios-cd.bin + -no-emul-boot -boot-load-size 4 -boot-info-table + --efi-boot limine-uefi-cd.bin + -efi-boot-part --efi-boot-image --protective-msdos-label + ${ISO_DIR} -o ${CMAKE_CURRENT_BINARY_DIR}/kernel.iso + COMMAND ${LIMINE_DIR}/limine bios-install ${CMAKE_CURRENT_BINARY_DIR}/kernel.iso + #COMMAND sudo rm -rf ${ISO_DIR} + DEPENDS create-fat32-disk uiaos-kernel + VERBATIM +) \ No newline at end of file diff --git a/src/group_name/README.md b/src/group_name/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/group_name/include/libc/limits.h b/src/group_name/include/libc/limits.h new file mode 100644 index 0000000..c71f291 --- /dev/null +++ b/src/group_name/include/libc/limits.h @@ -0,0 +1,4 @@ +#pragma once + +#define INT_MAX 2147483647 + diff --git a/src/group_name/include/libc/stdarg.h b/src/group_name/include/libc/stdarg.h new file mode 100644 index 0000000..1bb1d2e --- /dev/null +++ b/src/group_name/include/libc/stdarg.h @@ -0,0 +1,14 @@ +#pragma once + +// va_list +typedef __builtin_va_list va_list; + +// va_start +#define va_start(v, l) __builtin_va_start(v, l) + +// va_end +#define va_end(v) __builtin_va_end(v) + +// va_arg +#define va_arg(v, l) __builtin_va_arg(v, l) + diff --git a/src/group_name/include/libc/stdbool.h b/src/group_name/include/libc/stdbool.h new file mode 100644 index 0000000..e50609d --- /dev/null +++ b/src/group_name/include/libc/stdbool.h @@ -0,0 +1,5 @@ +#pragma once + +#define bool unsigned char +#define true 1 +#define false 0 diff --git a/src/group_name/include/libc/stddef.h b/src/group_name/include/libc/stddef.h new file mode 100644 index 0000000..096a90f --- /dev/null +++ b/src/group_name/include/libc/stddef.h @@ -0,0 +1,3 @@ +#pragma once + +#define NULL ((void*)0) \ No newline at end of file diff --git a/src/group_name/include/libc/stdint.h b/src/group_name/include/libc/stdint.h new file mode 100644 index 0000000..47bfba6 --- /dev/null +++ b/src/group_name/include/libc/stdint.h @@ -0,0 +1,10 @@ +#pragma once + + +typedef long unsigned int size_t; +typedef long unsigned int uint32_t; +typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +typedef long int int32_t; +typedef short int16_t; +typedef signed char int8_t; diff --git a/src/group_name/include/libc/stdio.h b/src/group_name/include/libc/stdio.h new file mode 100644 index 0000000..d63bc7a --- /dev/null +++ b/src/group_name/include/libc/stdio.h @@ -0,0 +1,5 @@ +#pragma once + +int putchar(int ic); +bool print(const char* data, size_t length); +int printf(const char* __restrict__ format, ...); \ No newline at end of file diff --git a/src/group_name/include/libc/string.h b/src/group_name/include/libc/string.h new file mode 100644 index 0000000..a59cc26 --- /dev/null +++ b/src/group_name/include/libc/string.h @@ -0,0 +1,4 @@ +#pragma once + + +size_t strlen(const char* str); \ No newline at end of file diff --git a/src/group_name/include/multiboot2.h b/src/group_name/include/multiboot2.h new file mode 100644 index 0000000..aee9e5d --- /dev/null +++ b/src/group_name/include/multiboot2.h @@ -0,0 +1,417 @@ +/* multiboot2.h - Multiboot 2 header file. */ +/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY + * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR + * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef MULTIBOOT_HEADER +#define MULTIBOOT_HEADER 1 + +/* How many bytes from the start of the file we search for the header. */ +#define MULTIBOOT_SEARCH 32768 +#define MULTIBOOT_HEADER_ALIGN 8 + +/* The magic field should contain this. */ +#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6 + +/* This should be in %eax. */ +#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289 + +/* Alignment of multiboot modules. */ +#define MULTIBOOT_MOD_ALIGN 0x00001000 + +/* Alignment of the multiboot info structure. */ +#define MULTIBOOT_INFO_ALIGN 0x00000008 + +/* Flags set in the ’flags’ member of the multiboot header. */ + +#define MULTIBOOT_TAG_ALIGN 8 +#define MULTIBOOT_TAG_TYPE_END 0 +#define MULTIBOOT_TAG_TYPE_CMDLINE 1 +#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2 +#define MULTIBOOT_TAG_TYPE_MODULE 3 +#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 +#define MULTIBOOT_TAG_TYPE_BOOTDEV 5 +#define MULTIBOOT_TAG_TYPE_MMAP 6 +#define MULTIBOOT_TAG_TYPE_VBE 7 +#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8 +#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9 +#define MULTIBOOT_TAG_TYPE_APM 10 +#define MULTIBOOT_TAG_TYPE_EFI32 11 +#define MULTIBOOT_TAG_TYPE_EFI64 12 +#define MULTIBOOT_TAG_TYPE_SMBIOS 13 +#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14 +#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15 +#define MULTIBOOT_TAG_TYPE_NETWORK 16 +#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17 +#define MULTIBOOT_TAG_TYPE_EFI_BS 18 +#define MULTIBOOT_TAG_TYPE_EFI32_IH 19 +#define MULTIBOOT_TAG_TYPE_EFI64_IH 20 +#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21 + +#define MULTIBOOT_HEADER_TAG_END 0 +#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1 +#define MULTIBOOT_HEADER_TAG_ADDRESS 2 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3 +#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4 +#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5 +#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6 +#define MULTIBOOT_HEADER_TAG_EFI_BS 7 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 +#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 + +#define MULTIBOOT_ARCHITECTURE_I386 0 +#define MULTIBOOT_ARCHITECTURE_MIPS32 4 +#define MULTIBOOT_HEADER_TAG_OPTIONAL 1 + +#define MULTIBOOT_LOAD_PREFERENCE_NONE 0 +#define MULTIBOOT_LOAD_PREFERENCE_LOW 1 +#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2 + +#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1 +#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2 + +#ifndef ASM_FILE + +typedef unsigned char multiboot_uint8_t; +typedef unsigned short multiboot_uint16_t; +typedef unsigned int multiboot_uint32_t; +typedef unsigned long long multiboot_uint64_t; + +struct multiboot_header +{ + /* Must be MULTIBOOT_MAGIC - see above. */ + multiboot_uint32_t magic; + + /* ISA */ + multiboot_uint32_t architecture; + + /* Total header length. */ + multiboot_uint32_t header_length; + + /* The above fields plus this one must equal 0 mod 2^32. */ + multiboot_uint32_t checksum; +}; + +struct multiboot_header_tag +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; +}; + +struct multiboot_header_tag_information_request +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t requests[0]; +}; + +struct multiboot_header_tag_address +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t header_addr; + multiboot_uint32_t load_addr; + multiboot_uint32_t load_end_addr; + multiboot_uint32_t bss_end_addr; +}; + +struct multiboot_header_tag_entry_address +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t entry_addr; +}; + +struct multiboot_header_tag_console_flags +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t console_flags; +}; + +struct multiboot_header_tag_framebuffer +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t width; + multiboot_uint32_t height; + multiboot_uint32_t depth; +}; + +struct multiboot_header_tag_module_align +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; +}; + +struct multiboot_header_tag_relocatable +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t min_addr; + multiboot_uint32_t max_addr; + multiboot_uint32_t align; + multiboot_uint32_t preference; +}; + +struct multiboot_color +{ + multiboot_uint8_t red; + multiboot_uint8_t green; + multiboot_uint8_t blue; +}; + +struct multiboot_mmap_entry +{ + multiboot_uint64_t addr; + multiboot_uint64_t len; +#define MULTIBOOT_MEMORY_AVAILABLE 1 +#define MULTIBOOT_MEMORY_RESERVED 2 +#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 +#define MULTIBOOT_MEMORY_NVS 4 +#define MULTIBOOT_MEMORY_BADRAM 5 + multiboot_uint32_t type; + multiboot_uint32_t zero; +}; +typedef struct multiboot_mmap_entry multiboot_memory_map_t; + +struct multiboot_tag +{ + multiboot_uint32_t type; + multiboot_uint32_t size; +}; + +struct multiboot_tag_string +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + char string[0]; +}; + +struct multiboot_tag_module +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t mod_start; + multiboot_uint32_t mod_end; + char cmdline[0]; +}; + +struct multiboot_tag_basic_meminfo +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t mem_lower; + multiboot_uint32_t mem_upper; +}; + +struct multiboot_tag_bootdev +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t biosdev; + multiboot_uint32_t slice; + multiboot_uint32_t part; +}; + +struct multiboot_tag_mmap +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t entry_size; + multiboot_uint32_t entry_version; + struct multiboot_mmap_entry entries[0]; +}; + +struct multiboot_vbe_info_block +{ + multiboot_uint8_t external_specification[512]; +}; + +struct multiboot_vbe_mode_info_block +{ + multiboot_uint8_t external_specification[256]; +}; + +struct multiboot_tag_vbe +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + + multiboot_uint16_t vbe_mode; + multiboot_uint16_t vbe_interface_seg; + multiboot_uint16_t vbe_interface_off; + multiboot_uint16_t vbe_interface_len; + + struct multiboot_vbe_info_block vbe_control_info; + struct multiboot_vbe_mode_info_block vbe_mode_info; +}; + +struct multiboot_tag_framebuffer_common +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + + multiboot_uint64_t framebuffer_addr; + multiboot_uint32_t framebuffer_pitch; + multiboot_uint32_t framebuffer_width; + multiboot_uint32_t framebuffer_height; + multiboot_uint8_t framebuffer_bpp; +#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 +#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 +#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 + multiboot_uint8_t framebuffer_type; + multiboot_uint16_t reserved; +}; + +struct multiboot_tag_framebuffer +{ + struct multiboot_tag_framebuffer_common common; + + union + { + struct + { + multiboot_uint16_t framebuffer_palette_num_colors; + struct multiboot_color framebuffer_palette[0]; + }; + struct + { + multiboot_uint8_t framebuffer_red_field_position; + multiboot_uint8_t framebuffer_red_mask_size; + multiboot_uint8_t framebuffer_green_field_position; + multiboot_uint8_t framebuffer_green_mask_size; + multiboot_uint8_t framebuffer_blue_field_position; + multiboot_uint8_t framebuffer_blue_mask_size; + }; + }; +}; + +struct multiboot_tag_elf_sections +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t num; + multiboot_uint32_t entsize; + multiboot_uint32_t shndx; + char sections[0]; +}; + +struct multiboot_tag_apm +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint16_t version; + multiboot_uint16_t cseg; + multiboot_uint32_t offset; + multiboot_uint16_t cseg_16; + multiboot_uint16_t dseg; + multiboot_uint16_t flags; + multiboot_uint16_t cseg_len; + multiboot_uint16_t cseg_16_len; + multiboot_uint16_t dseg_len; +}; + +struct multiboot_tag_efi32 +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t pointer; +}; + +struct multiboot_tag_efi64 +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint64_t pointer; +}; + +struct multiboot_tag_smbios +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t major; + multiboot_uint8_t minor; + multiboot_uint8_t reserved[6]; + multiboot_uint8_t tables[0]; +}; + +struct multiboot_tag_old_acpi +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t rsdp[0]; +}; + +struct multiboot_tag_new_acpi +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t rsdp[0]; +}; + +struct multiboot_tag_network +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint8_t dhcpack[0]; +}; + +struct multiboot_tag_efi_mmap +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t descr_size; + multiboot_uint32_t descr_vers; + multiboot_uint8_t efi_mmap[0]; +}; + +struct multiboot_tag_efi32_ih +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t pointer; +}; + +struct multiboot_tag_efi64_ih +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint64_t pointer; +}; + +struct multiboot_tag_load_base_addr +{ + multiboot_uint32_t type; + multiboot_uint32_t size; + multiboot_uint32_t load_base_addr; +}; + +#endif /* ! ASM_FILE */ + +#endif /* ! MULTIBOOT_HEADER */ diff --git a/src/group_name/limine.cfg b/src/group_name/limine.cfg new file mode 100644 index 0000000..30aa688 --- /dev/null +++ b/src/group_name/limine.cfg @@ -0,0 +1,19 @@ +# Timeout in seconds that Limine will use before automatically booting. +TIMEOUT=5 + +# The entry name that will be displayed in the boot menu. +:UiA OS (KASLR on) + # We use the Limine boot protocol. + PROTOCOL=multiboot2 + + # Path to the kernel to boot. boot:/// represents the partition on which limine.cfg is located. + KERNEL_PATH=boot:///kernel.bin + +# Same thing, but without KASLR. +:UiA OS (KASLR off) + PROTOCOL=multiboot2 + + # Disable KASLR (it is enabled by default for relocatable kernels) + KASLR=no + + KERNEL_PATH=boot:///kernel.bin \ No newline at end of file diff --git a/src/group_name/scripts/start_qemu.sh b/src/group_name/scripts/start_qemu.sh new file mode 100644 index 0000000..0e0ccd5 --- /dev/null +++ b/src/group_name/scripts/start_qemu.sh @@ -0,0 +1,39 @@ +#!/bin/bash +KERNEL_PATH=$1 +DISK_PATH=$2 + +# Start QEMU in the background +echo "Starting QEMU" +qemu-system-i386 -S -gdb tcp::1234 -boot d -hda $KERNEL_PATH -hdb $DISK_PATH -m 64 -audiodev sdl,id=sdl1,out.buffer-length=40000 -machine pcspk-audiodev=sdl1 -serial pty & +QEMU_PID=$! + +# Function to check if gdb is running +is_gdb_running() { + pgrep -f "gdb-multiarch" > /dev/null +} + +# Function to handle termination signals +cleanup() { + echo "Stopping QEMU..." + kill $QEMU_PID + exit 0 +} + +# Trap SIGINT and SIGTERM signals +trap cleanup SIGINT SIGTERM + +# Wait for gdb to start +echo "Waiting for gdb to start..." +while ! is_gdb_running; do + sleep 1 +done +echo "gdb started." + +# Wait for gdb to stop +echo "Monitoring gdb connection..." +while is_gdb_running; do + sleep 1 +done + +# Cleanup after gdb stops +cleanup diff --git a/src/group_name/src/README.md b/src/group_name/src/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/group_name/src/arch/i386/README.md b/src/group_name/src/arch/i386/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/group_name/src/arch/i386/linker.ld b/src/group_name/src/arch/i386/linker.ld new file mode 100644 index 0000000..a2ae4f4 --- /dev/null +++ b/src/group_name/src/arch/i386/linker.ld @@ -0,0 +1,37 @@ +ENTRY(_start) + +SECTIONS { + . = 1M; + + .boot : + { + /* Ensure that the multiboot header is at the beginning! */ + *(.multiboot_header) + } + + . = ALIGN(4K); + .text : + { + *(.text .text.*) + } + + . = ALIGN(4K); + .rodata : + { + *(.rodata .rodata.*) + } + + . = ALIGN(4K); + .data : + { + *(.data .data.*) + } + + . = ALIGN(4K); + .bss : + { + *(.bss .bss.*) + } + + end = .; _end = .; __end = .; +} \ No newline at end of file diff --git a/src/group_name/src/arch/x86_64/README.md b/src/group_name/src/arch/x86_64/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/group_name/src/arch/x86_64/linker.ld b/src/group_name/src/arch/x86_64/linker.ld new file mode 100644 index 0000000..660f005 --- /dev/null +++ b/src/group_name/src/arch/x86_64/linker.ld @@ -0,0 +1,63 @@ +/* Tell the linker that we want an x86_64 ELF64 output file */ +OUTPUT_FORMAT(elf64-x86-64) +OUTPUT_ARCH(i386:x86-64) + +/* We want the symbol _start to be our entry point */ +ENTRY(_start) + +/* Define the program headers we want so the bootloader gives us the right */ +/* MMU permissions */ +PHDRS +{ + 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 +{ + /* We wanna be placed in the topmost 2GiB of the address space, for optimisations */ + /* and because that is what the Limine spec mandates. */ + /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */ + /* that is the beginning of the region. */ + . = 0xffffffff80000000; + + .text : { + *(.text .text.*) + } :text + + /* Move to the next memory page for .rodata */ + . += CONSTANT(MAXPAGESIZE); + + .rodata : { + *(.rodata .rodata.*) + } :rodata + + /* Move to the next memory page for .data */ + . += CONSTANT(MAXPAGESIZE); + + .data : { + *(.data .data.*) + } :data + + /* Dynamic section for relocations, both in its own PHDR and inside data PHDR */ + .dynamic : { + *(.dynamic) + } :data :dynamic + + /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ + /* unnecessary zeros will be written to the binary. */ + /* If you need, for example, .init_array and .fini_array, those should be placed */ + /* above this. */ + .bss : { + *(.bss .bss.*) + *(COMMON) + } :data + + /* Discard .note.* and .eh_frame since they may cause issues on some hosts. */ + /DISCARD/ : { + *(.eh_frame) + *(.note .note.*) + } +} \ No newline at end of file diff --git a/src/group_name/src/multiboot2.asm b/src/group_name/src/multiboot2.asm new file mode 100644 index 0000000..4b1b41d --- /dev/null +++ b/src/group_name/src/multiboot2.asm @@ -0,0 +1,45 @@ +extern main + +global _start + +section .multiboot_header +header_start: + dd 0xe85250d6 ; Magic number (multiboot 2) + dd 0 ; Architecture 0 (protected mode i386) + dd header_end - header_start ; Header length + dd 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start)) ; Checksum + +;align 8 +;framebuffer_tag_start: +; dw 5 ; type +; dw 1 ; flags +; dd framebuffer_tag_end - framebuffer_tag_start ; size +; dd 800 ; width +; dd 600 ; height +; dd 32 ; depth +;framebuffer_tag_end: + +align 8 + ; Required end tag: + dw 0 ; type + dw 0 ; flags + dw 8 ; size +header_end: + +section .text +bits 32 + +_start: + cli + + mov esp, stack_top + + push ebx + push eax + + call main ; Jump main function + +section .bss +stack_bottom: + resb 4096 * 16 +stack_top: \ No newline at end of file