Merge into main the new state of the operating system/kernel #1
9
Makefile
9
Makefile
@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc
|
|||||||
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
||||||
CFLAGS = -ffreestanding -O2 -Wall -Wextra
|
CFLAGS = -ffreestanding -O2 -Wall -Wextra
|
||||||
|
|
||||||
OFILES = $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/PhysicalMemoryManager.o $(BUILD_DIR)/io.o $(BUILD_DIR)/PageDirectory.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o
|
OFILES = $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/pit.o $(BUILD_DIR)/PhysicalMemoryManager.o $(BUILD_DIR)/io.o $(BUILD_DIR)/PageDirectory.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o
|
||||||
|
|
||||||
SRC_DIR = src
|
SRC_DIR = src
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
@ -23,8 +23,6 @@ all: clean build
|
|||||||
|
|
||||||
build: build_kernel iso
|
build: build_kernel iso
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
clean_iso:
|
clean_iso:
|
||||||
if [[ -a isodir/boot ]] ; then rm root/boot -rd ; fi
|
if [[ -a isodir/boot ]] ; then rm root/boot -rd ; fi
|
||||||
if [ -f build/barinkOS.iso ] ; then rm build/barinkOS.iso ; fi
|
if [ -f build/barinkOS.iso ] ; then rm build/barinkOS.iso ; fi
|
||||||
@ -36,7 +34,7 @@ iso: clean_iso clean build
|
|||||||
grub-mkrescue -o build/barinkOS.iso root
|
grub-mkrescue -o build/barinkOS.iso root
|
||||||
|
|
||||||
test:
|
test:
|
||||||
$(EMULATOR) -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -monitor stdio -display gtk -m 2G -cpu core2duo
|
$(EMULATOR) -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -display gtk -m 2G -cpu core2duo
|
||||||
|
|
||||||
build_kernel: $(OBJ_LINK_LIST)
|
build_kernel: $(OBJ_LINK_LIST)
|
||||||
$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \
|
$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \
|
||||||
@ -85,3 +83,6 @@ $(BUILD_DIR)/string.o:
|
|||||||
|
|
||||||
$(BUILD_DIR)/PhysicalMemoryManager.o:
|
$(BUILD_DIR)/PhysicalMemoryManager.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/memory/PhysicalMemoryManager.cpp -o $(BUILD_DIR)/PhysicalMemoryManager.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/memory/PhysicalMemoryManager.cpp -o $(BUILD_DIR)/PhysicalMemoryManager.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
$(BUILD_DIR)/pit.o:
|
||||||
|
$(CPP) -c $(SRC_DIR)/kernel/pit.cpp -o $(BUILD_DIR)/pit.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
@ -21,6 +21,7 @@ stack_bottom:
|
|||||||
stack_top:
|
stack_top:
|
||||||
|
|
||||||
.section .text
|
.section .text
|
||||||
|
.include "./src/kernel/gdt/gdt.s"
|
||||||
.include "./src/kernel/irs_table.s"
|
.include "./src/kernel/irs_table.s"
|
||||||
.include "./src/kernel/irq_table.s"
|
.include "./src/kernel/irq_table.s"
|
||||||
.include "./src/kernel/idt/idt.s"
|
.include "./src/kernel/idt/idt.s"
|
||||||
@ -45,34 +46,21 @@ _start:
|
|||||||
pushl %eax
|
pushl %eax
|
||||||
|
|
||||||
call early_main
|
call early_main
|
||||||
|
|
||||||
|
|
||||||
|
mov %cr0, %eax
|
||||||
|
or $1, %eax
|
||||||
|
mov %eax, %cr0
|
||||||
|
|
||||||
|
|
||||||
|
call kernel_main
|
||||||
|
|
||||||
|
|
||||||
cli
|
cli
|
||||||
|
1: hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
.include "./src/kernel/gdt/gdt.s"
|
|
||||||
|
|
||||||
loadIDT:
|
|
||||||
#load idt
|
|
||||||
call init_idt
|
|
||||||
sti
|
|
||||||
|
|
||||||
# Try enable A20
|
|
||||||
# mov $0x2401, %ax
|
|
||||||
# int $0x15
|
|
||||||
|
|
||||||
|
|
||||||
# enable protected mode
|
.size _start, . - _start
|
||||||
mov %cr0, %eax
|
|
||||||
or $1, %eax
|
|
||||||
mov %eax, %cr0
|
|
||||||
|
|
||||||
|
|
||||||
call kernel_main
|
|
||||||
|
|
||||||
|
|
||||||
cli
|
|
||||||
1: hlt
|
|
||||||
jmp 1b
|
|
||||||
|
|
||||||
|
|
||||||
.size _start, . - _start
|
|
@ -29,6 +29,8 @@ void add_descriptor(int which , unsigned long base, unsigned long limit, unsigne
|
|||||||
|
|
||||||
void initGDT(){
|
void initGDT(){
|
||||||
|
|
||||||
|
printf("Init GDT!\n");
|
||||||
|
|
||||||
// NULL segment
|
// NULL segment
|
||||||
add_descriptor(NULL_SEGMENT, 0,0,0,0);
|
add_descriptor(NULL_SEGMENT, 0,0,0,0);
|
||||||
|
|
||||||
@ -52,10 +54,4 @@ void initGDT(){
|
|||||||
|
|
||||||
LoadGlobalDescriptorTable();
|
LoadGlobalDescriptorTable();
|
||||||
|
|
||||||
while (true)
|
|
||||||
asm volatile("hlt");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "idt.h"
|
#include "idt.h"
|
||||||
|
#include "../pit.h"
|
||||||
//#include "scancodes/set1.h"
|
//#include "scancodes/set1.h"
|
||||||
|
|
||||||
IDT_entry idt_table[256];
|
IDT_entry idt_table[256];
|
||||||
@ -24,6 +25,8 @@ void irs_handler (registers regs) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -32,36 +35,33 @@ void irs_handler (registers regs) {
|
|||||||
|
|
||||||
|
|
||||||
void irq_handler (registers regs) {
|
void irq_handler (registers regs) {
|
||||||
|
|
||||||
|
switch (regs.int_no)
|
||||||
if ( regs.int_no != 0) {
|
{
|
||||||
kterm_writestring("received interrupt!\n");
|
case 0:
|
||||||
printf("(IRQ) Interrupt number: %d \n", regs.int_no);
|
pit_tick++;
|
||||||
|
break;
|
||||||
}
|
case 1:
|
||||||
|
|
||||||
if ( regs.int_no == 1 ){
|
|
||||||
// Keyboard interrupt !!
|
// Keyboard interrupt !!
|
||||||
|
|
||||||
int scan;
|
int scan;
|
||||||
/*register*/int i;
|
/*register*/int i;
|
||||||
|
|
||||||
// Read scancode
|
// Read scancode
|
||||||
|
|
||||||
scan = inb(0x60);
|
scan = inb(0x60);
|
||||||
|
|
||||||
// Send ack message!
|
// Send ack message!
|
||||||
i = inb(0x61);
|
i = inb(0x61);
|
||||||
outb(0x61, i|0x80);
|
outb(0x61, i|0x80);
|
||||||
outb(0x61, i);
|
outb(0x61, i);
|
||||||
kterm_writestring("A key was pressed/released\n");
|
|
||||||
printf( "Scancode: %x\n", scan);
|
printf( "Scancode: %x\n", scan);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
}
|
printf("Received INT: 0x%x\n", regs.int_no);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
outb(0x20, 0x20); // send end of interrupt to master
|
outb(0x20, 0x20); // send end of interrupt to master
|
||||||
|
|
||||||
if ( regs.int_no > 8 && regs.int_no <= 15) {
|
if ( regs.int_no > 8 && regs.int_no <= 15) {
|
||||||
@ -76,16 +76,13 @@ void irq_handler (registers regs) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void init_idt(){
|
void init_idt(){
|
||||||
// Initialise the IDT pointer
|
// Initialise the IDT pointer
|
||||||
idt_ptr.length = sizeof(IDT_entry) * 255;
|
idt_ptr.length = sizeof(IDT_entry) * 255;
|
||||||
idt_ptr.base = (uint32_t)&idt_table;
|
idt_ptr.base = (uint32_t)&idt_table;
|
||||||
|
|
||||||
|
printf("Init IDT\n");
|
||||||
|
|
||||||
// TODO: Set everything to zero first
|
// TODO: Set everything to zero first
|
||||||
|
|
||||||
set_id_entry(0, (uint32_t) irs0 , 0x08, 0x8F);
|
set_id_entry(0, (uint32_t) irs0 , 0x08, 0x8F);
|
||||||
|
@ -22,7 +22,7 @@ unsigned int inl_p(unsigned short ){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void outb_p(unsigned char , unsigned short ){
|
void b_p(unsigned char , unsigned short ){
|
||||||
|
|
||||||
}
|
}
|
||||||
void outw(unsigned short , unsigned short ){
|
void outw(unsigned short , unsigned short ){
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#define GB4 524288
|
|
||||||
#define GB2 262144
|
#define GB2 262144
|
||||||
|
|
||||||
|
extern "C" void kernel_main (void);
|
||||||
|
|
||||||
extern "C" void early_main(unsigned long magic, unsigned long addr){
|
extern "C" void early_main(unsigned long magic, unsigned long addr){
|
||||||
/** initialize terminal interface */
|
/** initialize terminal interface */
|
||||||
kterm_init();
|
kterm_init();
|
||||||
@ -27,19 +29,30 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
initGDT();
|
initGDT();
|
||||||
|
init_idt();
|
||||||
|
// Enable interrupts
|
||||||
|
asm volatile("STI");
|
||||||
|
|
||||||
|
|
||||||
|
kernel_main();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void kernel_main (void) {
|
extern "C" void kernel_main (void) {
|
||||||
|
|
||||||
printf("call to init serial\n");
|
|
||||||
init_serial();
|
init_serial();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pit_initialise();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (true){
|
while (true){
|
||||||
//Read time indefinetely
|
//Read time indefinetely
|
||||||
read_rtc();
|
read_rtc();
|
||||||
printf( "UTC time: %02d-%02d-%02d %02d:%02d:%02d [ Formatted as YY-MM-DD h:mm:ss]\r" ,year, month, day, hour, minute, second);
|
printf( "UTC time: %02d-%02d-%02d %02d:%02d:%02d (Ticks: %06d) [ Formatted as YY-MM-DD h:mm:ss]\r" ,year, month, day, hour, minute, second, pit_tick);
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ extern "C"{
|
|||||||
#include "gdt/gdtc.h"
|
#include "gdt/gdtc.h"
|
||||||
#include "idt/idt.h"
|
#include "idt/idt.h"
|
||||||
|
|
||||||
|
#include "pit.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
|
53
src/kernel/pit.cpp
Normal file
53
src/kernel/pit.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#include "pit.h"
|
||||||
|
#include "tty/kterm.h"
|
||||||
|
uint32_t pit_tick = 0;
|
||||||
|
|
||||||
|
|
||||||
|
void pit_initialise()
|
||||||
|
{
|
||||||
|
asm volatile("CLI");
|
||||||
|
|
||||||
|
printf("init PIT!\n");
|
||||||
|
|
||||||
|
// clear mask for IRQ 0
|
||||||
|
uint8_t value = inb(0x21) & ~(1<< 0);
|
||||||
|
outb(0x21, value);
|
||||||
|
|
||||||
|
io_wait();
|
||||||
|
|
||||||
|
const int freq = 500;
|
||||||
|
|
||||||
|
uint32_t divisor = 1193180 / freq;
|
||||||
|
|
||||||
|
outb(PIT_COMMAND, 0x36);
|
||||||
|
|
||||||
|
uint8_t l = (uint8_t) (divisor & 0xFF);
|
||||||
|
uint8_t h = (uint8_t) ( (divisor>>8) & 0xff);
|
||||||
|
|
||||||
|
outb(PIT_DATA_0, l);
|
||||||
|
outb(PIT_DATA_0,h);
|
||||||
|
|
||||||
|
|
||||||
|
asm volatile("STI");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void get_pit_count()
|
||||||
|
{
|
||||||
|
asm volatile ("CLI");
|
||||||
|
|
||||||
|
outb(PIT_COMMAND, 0);
|
||||||
|
uint16_t count = inb(PIT_DATA_0);
|
||||||
|
count |= inb(PIT_DATA_0) << 8;
|
||||||
|
|
||||||
|
printf("PIT count: 0x%x\n", count);
|
||||||
|
|
||||||
|
asm volatile("STI");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_pit_count()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
18
src/kernel/pit.h
Normal file
18
src/kernel/pit.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "io.h"
|
||||||
|
#define PIT_DATA_0 0x40
|
||||||
|
#define PIT_DATA_1 0x41
|
||||||
|
#define PIT_DATA_2 0x42
|
||||||
|
#define PIT_COMMAND 0x43
|
||||||
|
|
||||||
|
|
||||||
|
extern uint32_t pit_tick;
|
||||||
|
|
||||||
|
|
||||||
|
void pit_initialise();
|
||||||
|
|
||||||
|
|
||||||
|
void get_pit_count();
|
||||||
|
|
||||||
|
void set_pit_count();
|
@ -4,6 +4,7 @@
|
|||||||
#include "io.h"
|
#include "io.h"
|
||||||
#define PORT 0x3f8
|
#define PORT 0x3f8
|
||||||
static int init_serial() {
|
static int init_serial() {
|
||||||
|
printf("Init serial\n");
|
||||||
outb(PORT + 1, 0x00); // Disable all interrupts
|
outb(PORT + 1, 0x00); // Disable all interrupts
|
||||||
outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor)
|
outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor)
|
||||||
outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud
|
outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud
|
||||||
|
Loading…
Reference in New Issue
Block a user