OS Barebones done
This commit is contained in:
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
CMakeFiles/
|
||||||
|
CMakeCache.txt
|
||||||
|
Makefile
|
||||||
|
cmake_install.cmake
|
||||||
|
.vscode/
|
||||||
|
./OwOS.bin
|
||||||
30
build/CMakeLists.txt
Normal file
30
build/CMakeLists.txt
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.9)
|
||||||
|
project(OwOS)
|
||||||
|
|
||||||
|
enable_language(ASM)
|
||||||
|
|
||||||
|
set(CMAKE_ASM_COMPILER "i686-elf-as")
|
||||||
|
set(CMAKE_C_COMPILER "i686-elf-gcc")
|
||||||
|
set(CMAKE_CXX_COMPILER "i686-elf-g++")
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "-ffreestanding -O2 -fno-rtti -Wno-write-strings -Wno-multichar -Wno-unused-parameter -Wno-overflow -Wno-narrowing -fno-exceptions -Wno-trigraphs ${CMAKE_CXX_FLAGS}")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "-T ../linker.ld -ffreestanding -O2 -nostdlib -lgcc -Wwrite-strings ${CMAKE_EXE_LINKER_FLAGS}")
|
||||||
|
|
||||||
|
include_directories(OwOS "../src")
|
||||||
|
|
||||||
|
# Kernel source
|
||||||
|
file(GLOB KERN_SRC
|
||||||
|
"../src/*.cpp"
|
||||||
|
"../src/*.asm"
|
||||||
|
"../*.asm"
|
||||||
|
"../*.cpp"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SRCS ${KERN_SRC})
|
||||||
|
|
||||||
|
add_executable(OwOS ${SRCS})
|
||||||
|
|
||||||
|
set_target_properties(OwOS PROPERTIES OUTPUT_NAME "OwOS.bin")
|
||||||
|
|
||||||
|
add_custom_target(iso COMMAND cp OwOS.bin ../iso/boot/OwOS.bin && grub-mkrescue -o OwOS.iso ../iso)
|
||||||
|
add_dependencies(iso OwOS)
|
||||||
BIN
build/OwOS.bin
Normal file
BIN
build/OwOS.bin
Normal file
Binary file not shown.
BIN
build/OwOS.iso
Normal file
BIN
build/OwOS.iso
Normal file
Binary file not shown.
41
install-crosscompiler.sh
Normal file
41
install-crosscompiler.sh
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Install requirements
|
||||||
|
sudo apt install build-essential bison flex libgmp3-dev libmpc-dev libmpfr-dev texinfo xorriso grub-pc-bin
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
export PREFIX="$HOME/opt/cross"
|
||||||
|
export TARGET=i686-elf
|
||||||
|
export PATH="$PREFIX/bin:$PATH"
|
||||||
|
|
||||||
|
# Create directories
|
||||||
|
mkdir $HOME/src
|
||||||
|
|
||||||
|
# Download binutils + gcc
|
||||||
|
wget https://ftp.nluug.nl/pub/gnu/binutils/binutils-2.31.tar.xz -O $HOME/src/binutils-2.31.tar.xz
|
||||||
|
wget https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.xz -O $HOME/src/gcc-8.2.0.tar.xz
|
||||||
|
|
||||||
|
# Decompress
|
||||||
|
cd $HOME/src
|
||||||
|
tar -xf binutils-2.31.tar.xz
|
||||||
|
tar -xf gcc-8.2.0.tar.xz
|
||||||
|
|
||||||
|
# Build binutils
|
||||||
|
cd $HOME/src
|
||||||
|
mkdir build-binutils
|
||||||
|
cd build-binutils
|
||||||
|
../binutils-2.31/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
|
||||||
|
make -j4
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Build GCC
|
||||||
|
cd $HOME/src
|
||||||
|
which -- $TARGET-as || echo $TARGET-as is not in the PATH
|
||||||
|
mkdir build-gcc
|
||||||
|
cd build-gcc
|
||||||
|
../gcc-8.2.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers
|
||||||
|
make all-gcc -j4
|
||||||
|
make all-target-libgcc -j4
|
||||||
|
make install-gcc
|
||||||
|
make install-target-libgcc
|
||||||
|
|
||||||
|
export PATH="$HOME/opt/cross/bin:$PATH"
|
||||||
|
echo "Done!"
|
||||||
BIN
iso/boot/OwOS.bin
Normal file
BIN
iso/boot/OwOS.bin
Normal file
Binary file not shown.
7
iso/boot/grub/grub.cfg
Normal file
7
iso/boot/grub/grub.cfg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
set timeout=0
|
||||||
|
set default=0
|
||||||
|
|
||||||
|
menuentry "OwOS v0.01" {
|
||||||
|
multiboot /boot/OwOS.bin
|
||||||
|
boot
|
||||||
|
}
|
||||||
61
kernel.asm
Normal file
61
kernel.asm
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# OwOS
|
||||||
|
# Copyright Benjamin Kyd (c) 2019
|
||||||
|
|
||||||
|
# declare constants for the multiboot header
|
||||||
|
.set ALIGN, 1<<0 # align loaded modules on page boundaries
|
||||||
|
.set MEMINFO, 1<<1 # provide memory map
|
||||||
|
.set FLAGS, ALIGN | MEMINFO # this is the Multiboot 'flag' field
|
||||||
|
.set MAGIC, 0x1BADB002 #'magic number' lets bootloader find the header
|
||||||
|
.set CHECKSUM, -(MAGIC + FLAGS) # checksum of above, to prove we are multiboot
|
||||||
|
|
||||||
|
.section .multiboot
|
||||||
|
.align 4
|
||||||
|
.long MAGIC
|
||||||
|
.long FLAGS
|
||||||
|
.long CHECKSUM
|
||||||
|
|
||||||
|
.section .bss
|
||||||
|
.align 16
|
||||||
|
stack_bottom:
|
||||||
|
.skip 16384 # 16 KiB
|
||||||
|
stack_top:
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
.global _start
|
||||||
|
.type _start, @function
|
||||||
|
|
||||||
|
_start:
|
||||||
|
# Settup stack
|
||||||
|
mov $stack_top, %esp
|
||||||
|
push %ebx
|
||||||
|
push %eax
|
||||||
|
|
||||||
|
# FPU Config
|
||||||
|
VAL_037F:
|
||||||
|
.hword 0x037F
|
||||||
|
VAL_037E:
|
||||||
|
.hword 0x037E
|
||||||
|
VAL_037A:
|
||||||
|
.hword 0x037A
|
||||||
|
# Configure FPU
|
||||||
|
cli
|
||||||
|
mov %cr0, %eax
|
||||||
|
or $0b00110010, %eax
|
||||||
|
and $0xFFFFFFFB, %eax
|
||||||
|
mov %eax, %cr0
|
||||||
|
fldcw VAL_037F
|
||||||
|
fldcw VAL_037E
|
||||||
|
fldcw VAL_037A
|
||||||
|
fninit
|
||||||
|
|
||||||
|
call kernel_main
|
||||||
|
|
||||||
|
cli
|
||||||
|
1: hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
_hang:
|
||||||
|
hlt
|
||||||
|
jmp _hang
|
||||||
|
|
||||||
|
.size _start, . - _start
|
||||||
41
kernel.cpp
Normal file
41
kernel.cpp
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#define TERM_WIDTH 80
|
||||||
|
#define TERM_HEIGHT 25
|
||||||
|
|
||||||
|
struct VGAChar_t {
|
||||||
|
char c;
|
||||||
|
char foreground:4;
|
||||||
|
char background:4;
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
VGAChar_t* framebuffer = (VGAChar_t*)0xB8000;
|
||||||
|
|
||||||
|
void putcar(int x, int y, char c, char foreground, char background) {
|
||||||
|
framebuffer[(y * TERM_WIDTH) + x].c = c;
|
||||||
|
framebuffer[(y * TERM_WIDTH) + x].foreground = foreground;
|
||||||
|
framebuffer[(y * TERM_WIDTH) + x].background = background;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
|
||||||
|
int kernel_main() {
|
||||||
|
|
||||||
|
for (int x = 0; x < TERM_WIDTH; x++)
|
||||||
|
for (int y = 0; y < TERM_HEIGHT; y++)
|
||||||
|
putcar(x, y, ' ', 0x00, 0x00);
|
||||||
|
|
||||||
|
putcar(0, 0, 'H', 0x01, 0x07);
|
||||||
|
putcar(1, 0, 'A', 0x01, 0x07);
|
||||||
|
putcar(2, 0, 'H', 0x01, 0x07);
|
||||||
|
putcar(3, 0, 'A', 0x01, 0x07);
|
||||||
|
putcar(4, 0, '!', 0x01, 0x07);
|
||||||
|
putcar(5, 0, ' ', 0x01, 0x07);
|
||||||
|
putcar(6, 0, 'P', 0x01, 0x07);
|
||||||
|
putcar(7, 0, 'E', 0x01, 0x07);
|
||||||
|
putcar(8, 0, 'N', 0x01, 0x07);
|
||||||
|
putcar(9, 0, 'I', 0x01, 0x07);
|
||||||
|
putcar(10, 0, 'S', 0x01, 0x07);
|
||||||
|
putcar(11, 0, '!', 0x01, 0x07);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
asm("hlt");
|
||||||
|
}
|
||||||
49
linker.ld
Normal file
49
linker.ld
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/* The bootloader will look at this image and start execution at the symbol
|
||||||
|
designated as the entry point. */
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
/* Tell where the various sections of the object files will be put in the final
|
||||||
|
kernel image. */
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* Begin putting sections at 1 MiB, a conventional place for kernels to be
|
||||||
|
loaded at by the bootloader. */
|
||||||
|
. = 1M;
|
||||||
|
|
||||||
|
/* First put the multiboot header, as it is required to be put very early
|
||||||
|
early in the image or the bootloader won't recognize the file format.
|
||||||
|
Next we'll put the .text section. */
|
||||||
|
.text BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(.multiboot)
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read-only data. */
|
||||||
|
.rodata BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read-write data (initialized) */
|
||||||
|
.data BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read-write data (uninitialized) and stack */
|
||||||
|
.bss BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(COMMON)
|
||||||
|
*(.bss)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Kernel size detection */
|
||||||
|
.sizedetect BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(.sizedetect)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The compiler may produce other sections, by default it will put them in
|
||||||
|
a segment with the same name. Simply add stuff here as needed. */
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user