Reverting to continue using GNU.
This commit is contained in:
parent
0808fa6972
commit
05b7cf1d7e
13
Makefile
13
Makefile
@ -17,18 +17,17 @@
|
|||||||
# General options
|
# General options
|
||||||
TARGET=i686
|
TARGET=i686
|
||||||
ARCH=$(shell echo $(TARGET) | sed s/i.86/x86/)
|
ARCH=$(shell echo $(TARGET) | sed s/i.86/x86/)
|
||||||
CROSSFLAGS=--target=$(TARGET)-pc-none-elf -march=$(TARGET)
|
|
||||||
# Assembly options
|
# Assembly options
|
||||||
AS=nasm
|
AS=i686-elf-as
|
||||||
AFLAGS=-felf32 -Isrc/kernel/arch/$(ARCH)/ -Isrc/
|
AFLAGS=
|
||||||
# C options
|
# C options
|
||||||
CC=clang
|
CC=i686-elf-gcc
|
||||||
CFLAGS?=-O0 -g
|
CFLAGS?=-O0 -g
|
||||||
CFLAGS:=$(CFLAGS) $(CROSSFLAGS) -std=c99 -ffreestanding -fno-builtin -nostdlibinc -Wall -Wextra -Isrc/
|
CFLAGS:=$(CFLAGS) -std=gnu99 -ffreestanding -Wall -Wextra -Isrc/
|
||||||
# Linker options
|
# Linker options
|
||||||
LDFLAGS?=-O0
|
LDFLAGS?=-O0
|
||||||
LDFLAGS:=$(LDFLAGS) $(CROSSFLAGS) -ffreestanding -nostdlib
|
LDFLAGS:=$(LDFLAGS) -ffreestanding -nostdlib
|
||||||
LIBS=
|
LIBS=-lgcc
|
||||||
|
|
||||||
# Binary variables
|
# Binary variables
|
||||||
OBJS=src/kernel/arch/$(ARCH)/boot.o src/kernel/kernel.o src/kernel/arch/$(ARCH)/tty.o
|
OBJS=src/kernel/arch/$(ARCH)/boot.o src/kernel/kernel.o src/kernel/arch/$(ARCH)/tty.o
|
||||||
|
14
README
14
README
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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
|
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user