Merge branch 'master' into cmake

This commit is contained in:
Nicolás Ortega Froysa 2018-03-14 19:11:52 +01:00
commit cdd614e7ba
No known key found for this signature in database
GPG Key ID: FEC70E3BAE2E69BF
5 changed files with 194 additions and 128 deletions

60
Makefile Normal file
View File

@ -0,0 +1,60 @@
# Copyright (C) 2018 Ortega Froysa, Nicolás <nortega@themusicinnoise.net>
# Author: Ortega Froysa, Nicolás <nortega@themusicinnoise.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that 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 this program. If not, see <http://www.gnu.org/licenses/>.
# General options
TARGET=i686
ARCH=$(shell echo $(TARGET) | sed s/i.86/x86/)
# Assembly options
AS=i686-elf-as
AFLAGS=
# C options
CC=i686-elf-gcc
CFLAGS?=-O0 -g
CFLAGS:=$(CFLAGS) -std=gnu99 -ffreestanding -Wall -Wextra -Isrc/
# Linker options
LDFLAGS?=-O0
LDFLAGS:=$(LDFLAGS) -ffreestanding -nostdlib
LIBS=-lgcc
# Binary variables
OBJS=src/kernel/arch/$(ARCH)/boot.o src/kernel/kernel.o src/kernel/arch/$(ARCH)/tty.o
colonel.bin: $(OBJS)
$(CC) -T src/kernel/arch/$(ARCH)/linker.ld -o $@ $(LDFLAGS) $^ $(LIBS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(AFLAGS) $< -o $@
.PHONY: all build-iso clean clean-all
all: colonel.bin
build-iso: colonel.iso
clean:
rm -f $(OBJS)
rm -rf isodir
clean-all: clean
rm -f *.iso *.bin
colonel.iso: colonel.bin
mkdir -p isodir/boot/grub/
cp configs/grub.cfg isodir/boot/grub/
cp $< isodir/boot/
grub-mkrescue -o $@ isodir

14
README
View File

@ -1,17 +1,17 @@
=============== ===============
*** Colonel *** *** Colonel ***
=============== ===============
Colonel (pronounced as it is spelt) is a small hobby kernel project This is a small OS project I'm working on. It's slow progress and
that I'm working on. It currently supports the following architectures: probably shouldn't be run anywhere except in an emulator. It currently
supports the following architectures:
- x86 - x86
# Compiling # Compiling
----------- -----------
This project uses Clang (https://clang.llvm.org/) and NASM You'll want to setup a cross-compilation toolchain with GCC
(http://www.nasm.us/) for building. You will also require GNU Make (https://gcc.gnu.org/) for your target architecture, along with
(https://www.gnu.org/software/make/), unless you want to manually go GNU Make (https://www.gnu.org/software/make/) (I'll switch to the
through and compile the files. GNU autotools as soon as I can get them to work properly).
To compile a full image you can run `make build-iso`, which will use To compile a full image you can run `make build-iso`, which will use
GNU GRUB (https://www.gnu.org/software/grub/) as the bootloader. Else, GNU GRUB (https://www.gnu.org/software/grub/) as the bootloader. Else,

View File

@ -1,65 +1,139 @@
; Copyright (C) 2018 Ortega Froysa, Nicolás <nortega@themusicinnoise.net> /*
; Author: Ortega Froysa, Nicolás <nortega@themusicinnoise.net> * Copyright (C) 2018 Ortega Froysa, Nicolás <nortega@themusicinnoise.net>
; * Author: Ortega Froysa, Nicolás <nortega@themusicinnoise.net>
; This program is free software: you can redistribute it and/or modify *
; it under the terms of the GNU General Public License as published by * This program is free software: you can redistribute it and/or modify
; the Free Software Foundation, either version 3 of the License, or * it under the terms of the GNU General Public License as published by
; (at your option) any later version. * the Free Software Foundation, either version 3 of the License, or
; * (at your option) any later version.
; This program is distributed in the hope that it will be useful, *
; but WITHOUT ANY WARRANTY; without even the implied warranty of * This program is distributed in the hope that it will be useful,
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * but WITHOUT ANY WARRANTY; without even the implied warranty of
; GNU General Public License for more details. * 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 this program. If not, see <http://www.gnu.org/licenses/>. * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
MBALIGN equ 1<<0 ; align loaded modules on page boundaries # declare constants for the multiboot header
MEMINFO equ 1<<1 ; provide memory map .set ALIGN, 1 << 0 # align loaded modules on page boundaries
FLAGS equ MBALIGN | MEMINFO ; multiboot flag field .set MEMINFO, 1 << 1 # provide memory map
MAGIC equ 0x1BADB002 ; magic number to help bootloader find the header .set FLAGS, ALIGN | MEMINFO # the multiboot `FLAG' field
CHECKSUM equ -(MAGIC + FLAGS) ; checksum of the above data .set MAGIC, 0x1BADB002 # 'magic number' letting the boot loader know we're here
.set CHECKSUM , -(MAGIC + FLAGS) # checksum of the above to prove we're multiboot
section .multiboot /*
align 4 * Declare the multiboot header marking this program as a kernel. The bootloader
dd MAGIC * will search for these values in the first 8 KiB of the kernel file aligned at
dd FLAGS * 32-bit boundaries (4 bytes). We put the signature in its own section to force
dd CHECKSUM * it within the first 8 KiB of the kernel file.
*/
.section .multiboot
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
section .bss /*
align 16 * Create a 16 byte aligned stack with 16 KiB of size. We create labels at the
* bottom and top of the stack.
*/
.section .bss
.align 16
stack_bottom: stack_bottom:
resb 16384 ; 16KiB .skip 16384 # 16 KiB
stack_top: stack_top:
section .data /*
%include "gdt.s" * Create the GDT
*/
.section .data
gdt_start:
gdt_null:
.long 0x0
.long 0x0
section .text gdt_kcode:
global _start:function (_start.end - _start) .word 0xFFFF # limit
.word 0x0 # base
.byte 0x0 # base
.byte 0b10011010 # 1st flags | type flags
.byte 0b11001111 # 2nd flags | limit
.byte 0x0 # base
gdt_kdata:
.word 0xFFFF # limit
.word 0x0 # base
.byte 0x0 # base
.byte 0b10010010 # 1st flags | type flags
.byte 0b11001111 # 2nd flags | limit
.byte 0x0 # base
gdt_ucode:
.word 0xFFFF # limit
.word 0x0 # base
.byte 0x0 # base
.byte 0b11111010 # 1st flags | type flags
.byte 0b11001111 # 2nd flags | limit
.byte 0x0 # base
gdt_udata:
.word 0xFFFF # limit
.word 0x0 # base
.byte 0x0 # base
.byte 0b11110010 # 1st flags | type flags
.byte 0b11001111 # 2nd flags | limit
.byte 0x0 # base
# TODO: setup the TSS
gdt_tss:
.word 0x0 # size of TSS (set later)
.word 0x0 # address of TSS (set later)
.byte 0x0 # address of TSS (set later)
.byte 0b10010001 # 1st flags | type flags
.byte 0b01000000 # 2nd flags | size of TSS (set later
.byte 0x0 # address of TSS (set later)
gdt_end:
gdtr:
.word (gdt_end - gdt_start - 1)
.long gdt_start
/*
* The linker script specifies the `_start' label as the entry point to the kernel
* and the bootloader will jump to this position. That is, this is where the kernel
* starts.
*/
.section .text
.global _start
.type _start, @function
_start: _start:
; setup the stack # set the position of `%esp' to the top of the stack
mov esp, stack_top mov $stack_top, %esp
; TODO: setup GDT, IDT, paging, etc. here # GDT, paging, and other features
flush_gdt:
cli cli
lgdt [gdtr] lgdt (gdtr)
jmp 0x08:.reload_segs movw $0x10, %ax
.reload_segs: movw %ax, %ds
mov ax, 0x10 movw %ax, %es
mov ds, ax movw %ax, %fs
mov es, ax movw %ax, %gs
mov fs, ax movw %ax, %ss
mov gs, ax ljmp $0x08, $flush_end
mov ss, ax flush_end:
; call the kernel boot_kernel:
extern kernel_main # enter high-level kernel (C)
call kernel_main call kernel_main
; hang # put computer into infinite loop
cli cli # disable interrupts by clearing the interrupt flag in `eflags'
.hang: end_loop:
hlt hlt # wait for next interrupt
jmp .hang jmp end_loop # jump to the `hlt' instruction if it ever leaves it
.end:
.size _start, . - _start

View File

@ -1,68 +0,0 @@
; Copyright (C) 2018 Ortega Froysa, Nicolás <nortega@themusicinnoise.net>
; Author: Ortega Froysa, Nicolás <nortega@themusicinnoise.net>
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that 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 this program. If not, see <http://www.gnu.org/licenses/>.
gdt_start:
gdt_null:
dd 0x0
dd 0x0
gdt_kcode:
dw 0xFFFF ; limit (bits 0-15)
dw 0x0 ; base (bits 0-15)
db 0x0 ; base (bits 16-23)
db 10011010b ; 1st flags | type flags
db 11001111b ; 2nd flags | limit (bits 16-19)
db 0x0 ; base (bits 24-31)
gdt_kdata:
dw 0xFFFF
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_ucode:
dw 0xFFFF
dw 0x0
db 0x0
db 11111010b
db 11001111b
db 0x0
gdt_udata:
dw 0xFFFF
dw 0x0
db 0x0
db 11110010b
db 11001111b
db 0x0
; TODO: fill this in later
gdt_tss:
dd 0x0
dd 0x0
gdt_end:
gdtr:
dw gdt_end - gdt_start - 1
dd gdt_start

View File

@ -18,7 +18,7 @@
#pragma once #pragma once
struct tss { volatile struct tss {
uint16_t link; uint16_t link;
uint16_t link_r; // reserved uint16_t link_r; // reserved