some stuff

This commit is contained in:
Jack Halford 2018-11-28 23:21:48 +01:00
parent ba108d9e3e
commit f02df6577e
8 changed files with 84 additions and 47 deletions

View file

@ -6,8 +6,8 @@ TARGET ?= $(ARCH)-$(OS)
all: all:
@printf "make kernel\t# build kernel binary\n" @printf "make kernel\t# build kernel binary\n"
@printf "make iso\t# build iso cdrom with grub\n" @printf "make iso\t# build iso cdrom\n"
@printf "make qemu\t# run qemu+gdb in tmux window\n" @printf "make qemu\t# run iso in qemu\n"
## COMPILE ASM (nasm) ## COMPILE ASM (nasm)
asm_source := $(wildcard src/arch/$(ARCH)/*.asm) asm_source := $(wildcard src/arch/$(ARCH)/*.asm)
@ -35,11 +35,12 @@ clean:
.PHONY: clean kernel iso $(rust_os) .PHONY: clean kernel iso $(rust_os)
# Bootloader recipes
ISO := $(kernel:.bin=.iso)
iso: $(ISO)
include mk/grub.mk
# Emulation recipes # Emulation recipes
include mk/qemu.mk include mk/qemu.mk
# Bootloader recipes
include mk/grub.mk
iso: $(grub-iso)
kernel: $(kernel) kernel: $(kernel)

View file

@ -1,8 +1,7 @@
grub-iso := $(kernel:.bin=.iso)
grub-cfg := src/arch/$(ARCH)/grub.cfg grub-cfg := src/arch/$(ARCH)/grub.cfg
isodir := build/isofiles isodir := build/isofiles
$(grub-iso): $(kernel) $(grub-cfg) Makefile $(ISO): $(kernel) $(grub-cfg) Makefile
@mkdir -p $(isodir)/boot/grub @mkdir -p $(isodir)/boot/grub
@cp $(grub-cfg) $(isodir)/boot/grub @cp $(grub-cfg) $(isodir)/boot/grub
@cp $(kernel) $(isodir)/boot/$(OS) @cp $(kernel) $(isodir)/boot/$(OS)

View file

@ -1,35 +1,24 @@
ifeq ($(shell whoami), jack) QEMU_SOCKET := /tmp/qemu.sock
PORT_MONIT := 4242 QEMU_MONITOR := socat - unix-connect:$(QEMU_SOCKET)
PORT_GDB := 4244 QEMU_GDB_PORT := 4242
else
PORT_MONIT := 4342
PORT_GDB := 4344
endif
QEMU := qemu-system-i386\
-cdrom build/bluesnow-x86.iso\
-S\
-enable-kvm\
-curses\
-gdb tcp::$(PORT_GDB)\
-monitor telnet:127.0.0.1:$(PORT_MONIT),server,nowait
qemu: qemu:
$(QEMU) qemu-system-i386\
-cdrom $(ISO)\
-S\
-enable-kvm\
-curses\
-gdb tcp::$(QEMU_GDB_PORT)\
-monitor unix:${QEMU_SOCKET},server,nowait
GDB := gdb -q\ qemu-gdb:
-symbols "$(kernel)" \ gdb -q\
-ex "target remote :$(PORT_GDB)"\ -symbols "$(kernel)" \
-ex "set arch i386" -ex "target remote :$(QEMU_GDB_PORT)"\
gdb: -ex "set arch i386"
$(GDB)
MONITOR := telnet 127.0.0.1 $(PORT_MONIT);\ qemu-monitor:
kill \`ps -x | grep \"[g]db -q\" | cut -d \ -f 1 \`;\ $(QEMU_MONITOR)
kill \`ps -x | grep \"[g]db -q\" | cut -d \ -f 2 \` qemu-reload:
monitor: echo "change ide1-cd0 $(ISO)" | $(QEMU_MONITOR) &>-
telnet 127.0.0.1 $(PORT_MONIT) echo "system_reset" | $(QEMU_MONITOR) &>-
#not using this anymore
william:
@tmux info >&- || { echo -e "\033[38;5;16mPlease run inside a tmux session\033[0m" ; exit 1; }
@tmux new-window 'tmux split-window -h "$(MONITOR)"; tmux split-window -fv "$(GDB)"; tmux select-pane -t 1; tmux resize-pane -x 80 -y 25; $(QEMU)'

View file

@ -56,9 +56,6 @@ interrupt!(0, pit, {
let sum = offset.1 + PIT_RATE; let sum = offset.1 + PIT_RATE;
offset.1 = sum % 1_000_000; offset.1 = sum % 1_000_000;
offset.0 += sum / 1_000_000; offset.0 += sum / 1_000_000;
if sum > 1_000_000 {
// fprintln!("uptime: {}s", offset.0);
}
} }
unsafe { pic::MASTER.ack() }; unsafe { pic::MASTER.ack() };
}); });

View file

@ -2,6 +2,7 @@ extern crate core;
// extern crate multiboot2; // extern crate multiboot2;
use acpi; use acpi;
use time;
use keyboard::PS2; use keyboard::PS2;
use core::char; use core::char;
use vga::*; use vga::*;
@ -28,6 +29,9 @@ fn dispatch(command: &str) -> Result<(), &'static str> {
"overflow" => self::overflow(), "overflow" => self::overflow(),
"page_fault" => self::page_fault(), "page_fault" => self::page_fault(),
// time
"uptime" => self::uptime(),
_ => Err("Command unknown. (h|help for help)"), _ => Err("Command unknown. (h|help for help)"),
} }
} }
@ -59,6 +63,13 @@ fn help() -> Result<(), &'static str> {
Ok(()) Ok(())
} }
fn uptime() -> Result<(), &'static str> {
let mut offset = time::OFFSET.lock();
fprintln!("{}s", offset.0 + offset.1 / 1_000_000);
flush!();
Ok(())
}
use x86::instructions::halt; use x86::instructions::halt;
/// Reboot the kernel /// Reboot the kernel
/// ///

View file

@ -54,10 +54,11 @@ pub fn kmain() -> ! {
// memory init after heap is available // memory init after heap is available
memory::init_noncore(); memory::init_noncore();
// vga is *not* cpu specific I think // load vga after core because is *not* cpu specific I think
vga::init(); vga::init();
scheduling::schedule(); // scheduler WIP
// scheduling::schedule();
unreachable!(); unreachable!();
} }

View file

@ -1,9 +1,10 @@
mod process; mod process;
mod sleep;
mod fifo; mod fifo;
use spin::Mutex; use spin::Mutex;
pub use self::process::*; pub use self::process::*;
lazy_static! { lazy_static! {
pub static ref SCHEDULER: Mutex<fifo::Fifo> = Mutex::new({ pub static ref SCHEDULER: Mutex<fifo::Fifo> = Mutex::new({
let init_process: u32 = self::init as *const () as u32; let init_process: u32 = self::init as *const () as u32;
@ -13,6 +14,7 @@ lazy_static! {
}); });
} }
/// Scheduler algorithm needs to implement this
pub trait Scheduler { pub trait Scheduler {
fn add_task(&mut self, ip: u32); fn add_task(&mut self, ip: u32);
fn next(&mut self) -> Option<Process>; fn next(&mut self) -> Option<Process>;
@ -42,7 +44,9 @@ pub fn fork() -> i32 {
0 0
} }
pub fn sleep() {} pub fn sleep() {
}
pub fn init() { pub fn init() {
fprintln!("init first line"); fprintln!("init first line");

View file

@ -4,3 +4,38 @@
//! managing these //! managing these
//! //!
//! inspired from https://wiki.osdev.org/Blocking_Process //! inspired from https://wiki.osdev.org/Blocking_Process
use alloc::VecDeque;
use super::*;
struct Sleeper {
process: Process,
// ms
ticks: u32,
}
/// osdev calls this a delta queue but google doesnt know
struct DeltaQueue {
queue: VecDeque<Sleeper>,
}
impl DeltaQueue {
pub fn insert(&mut self, process: Process, ticks: u32) {
let sleeper = Sleeper { process, ticks };
}
/// decreases timer on the list and returns the number
/// of finished sleepers
pub fn tick(&mut self) -> u32 {
let mut i: u32 = 0;
while let Some(link) = self.queue.get_mut(i as usize) {
// find how many links have 0 ticks left
if link.ticks > 0 {
link.ticks -= 1;
break;
}
i += 1;
}
i
}
}