summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGalen Sagarin <gps5307@rit.edu>2025-05-06 15:05:22 -0400
committerGalen Sagarin <gps5307@rit.edu>2025-05-06 15:05:22 -0400
commite4324f180c31ebf06206be6dff5f3863d6ec2675 (patch)
tree73f197fe28c8cc9efdb113b9702790d0085caaff
parenttar.c documentation (diff)
parentstart docs (diff)
downloadcomus-e4324f180c31ebf06206be6dff5f3863d6ec2675.tar.gz
comus-e4324f180c31ebf06206be6dff5f3863d6ec2675.tar.bz2
comus-e4324f180c31ebf06206be6dff5f3863d6ec2675.zip
Merge branch 'main' of https://github.com/kenshineto/kern
Should have fixed
-rw-r--r--docs/DRIVERS.md47
-rw-r--r--docs/FS.md0
-rw-r--r--docs/HEADERS.md0
-rw-r--r--docs/MEMORY.md0
-rw-r--r--docs/MODULES.md109
-rw-r--r--docs/PCB.md53
-rw-r--r--kernel/efi/gop.c4
-rw-r--r--kernel/fs/ramfs.c16
-rw-r--r--kernel/include/comus/limits.h2
-rw-r--r--kernel/procs.c1
-rw-r--r--kernel/term.c26
11 files changed, 245 insertions, 13 deletions
diff --git a/docs/DRIVERS.md b/docs/DRIVERS.md
new file mode 100644
index 0000000..e17e15e
--- /dev/null
+++ b/docs/DRIVERS.md
@@ -0,0 +1,47 @@
+# Drivers
+
+All drivers and their uses
+
+## acpi.c
+
+ACPI (Advanced Configuration and Power Interface)
+- allows powering off the system
+
+## ata.c
+
+ATA (Advanced Technology Attachment) / IDE (Integrated Drive Electronics)
+- ide/ata disk device driver
+
+## clock.c
+
+COMS real time clock driver
+
+## gpu/
+
+Contains drivers for each type of gpu
+- Bochs (QEMU default gpu device)
+- GOP (Graphics Output Protocol), UEFI framebuffer
+
+## gpu.c
+
+Functions for abstracting over current loaded gpu
+
+## pci.c
+
+PCI (Peripheral Component Interconnect)
+- driver to load pci devices (not pcie)
+
+## pit.c
+
+PIT (Programmable Interval Timer)
+- sends timer interrupts to the pic
+- set pc speaker tones
+
+## ps2.c
+
+PS2 Controller / Keyboard / Mouse driver
+- allows keyboard / mouse input
+
+## uart.c
+
+Serial (UART) driver
diff --git a/docs/FS.md b/docs/FS.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/FS.md
diff --git a/docs/HEADERS.md b/docs/HEADERS.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/HEADERS.md
diff --git a/docs/MEMORY.md b/docs/MEMORY.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/MEMORY.md
diff --git a/docs/MODULES.md b/docs/MODULES.md
new file mode 100644
index 0000000..cf452ff
--- /dev/null
+++ b/docs/MODULES.md
@@ -0,0 +1,109 @@
+# modules
+
+list of all kernel modules and their functions
+
+## cpu/
+
+Initalizes all cpu components and low level tabels.
+- FPU / SSE / AVX
+- IDT (Interrupt Descriptor Table)
+- PIC (Programmable Interrupt Controller)
+- TSS (Task State Segment)
+ - used for allowing kernel to switch into ring 3
+ - used for setting kernel stack on interrupt
+
+## drivers/
+
+Folder `drivers/` contains drivers for the system. See DRIVERS.md.
+
+File `drivers.c` loads each of the drivers in `drivers/`.
+
+## efi/
+
+Load UEFI components
+- UEFI memory map
+- GOP (Graphics Output Protocol), UEFI framebuffer
+
+## entry.S
+
+Entry point into the kernel along with:
+- GDT (Global Descriptor Table)
+- Multiboot header see https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html
+- Inital kernel stack
+ - not used once interrupts since interrupt stack will be used
+- Inital page tables
+ - see MEMORY.md
+
+Symbols:
+- `_start`
+ - generic legacy bios entrypoint in IA-32 mode
+
+- `_start_efi`
+ - uefi entrypoint in IA-32e mode
+
+## font/
+
+Loads psf2 font files into kernel .rodata segment
+
+## fs/
+
+See FS.md
+
+## include/
+
+All kernel headers.
+
+- SEE HEADERS.md
+
+## input.c
+
+Abstracts all input from all sources over a single keycode / mouseevent buffer.
+- uses ps2 and uart
+
+## lib/
+
+Kernel c library
+
+Notable files:
+
+- `backtrace.c` - does stack backtraces and logs them to output
+ - used during exceptions
+- `kspin.c`
+ - spinlock in kernel space
+- `panic.c`
+ - implements panic functions, along with halt called during exceptions or panic
+
+## main.c
+
+Kernel main entrypoint.
+- Loads all components of the kernel in order.
+- Loads init process
+- Dispatches init
+
+## mboot/
+
+Laod information provided by multiboot standard
+- `efi.c` - gets `EFI_SYSTEM_TABLE` & `EFI_HANDLE`
+ - read UEFI standard for more information
+- `mmap.c` - load memory map when in legacy boot
+ - memory map is loaded from `efi/` module when booting from UEFI
+- `module.c`
+ - loads initrd (ramdisk)
+- `rsdp.c`
+ - load root ACPI table, provided for the ACPI driver
+
+## memory/
+
+See MEMORY.md
+
+## procs.c
+
+Stores loaded process information and scheduler
+- multiple queues for scheduling
+ - ready - pcb is ready to be executed
+ - zombie - pcb is a zombie, and waiting to be cleaned up
+ - syscall - replaced blocked/waiting in baseline
+ - each syscall has its own queue
+ - acessed though syscall_queue[SYS_num]
+
+See PCB.md for pcb information.
diff --git a/docs/PCB.md b/docs/PCB.md
new file mode 100644
index 0000000..9eaa2a2
--- /dev/null
+++ b/docs/PCB.md
@@ -0,0 +1,53 @@
+# PCB
+
+PCB information
+
+## context
+
+Contains context infromation for the curernt process.
+- memory context (pcb->memctx)
+ - stores page directory and vitural address allocateor (see MEMORY.md)
+- context save area (pcb->regs)
+
+## medatada
+
+- `pid` - process idenfitication number
+- `parent` ` - parent of the current process
+ - can be NULL if the init process
+- `state` - the current runing state of the process
+ - `UNUSED` - proces in ptable is not used
+ - `NEW` - process in ptable has been allocated but has not been initalized
+ - `READY` - process is ready to be dispatched (and in ready queue)
+ - `RUNNING` - process is the current running process (and in no queues)
+ - `BLOCKED` - process is in a syscall queue waiting on their syscall to return
+ - `ZOMBIE` - process is a zombie and waiting to be cleaned up (in zombie queue)
+- `priority` - running process priority
+ - any number form 0 to SIZET_MAX
+ - higher priority means longer wait to be scheduled
+- `ticks` - number of ticks the process has been running for
+ - set to zero when process is not running
+
+## heap
+
+- `heap_start` is the start of the progams heap
+- `heap_len` is the length of the programs heap
+
+## open files
+
+- `open_files` is a list of currently opened files indexed by file descriptor
+
+## elf metadata
+
+- `elf_header` - the programs elf header (Elf64_Ehdr)
+- `elf_segments` - the programs loadable elf segments (Elf64_Phdr[])
+- `n_elf_segments` - the number of elf segmsnts the program has
+
+## queue linkage
+
+- `next` - the next pcb in the current queue this pcb is in
+
+## processs state information
+
+- `syscall` - the current syscall this process is blocked on
+- `wakeup` - the number of ticks until the process can be waked up (used during SYS_sleep)
+- `exit_status` - the exit status of the process when a zombie
diff --git a/kernel/efi/gop.c b/kernel/efi/gop.c
index 899bbee..5495980 100644
--- a/kernel/efi/gop.c
+++ b/kernel/efi/gop.c
@@ -4,6 +4,8 @@
static EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
+#define MAX_H_RES 1920
+
EFI_STATUS efi_load_gop(EFI_SYSTEM_TABLE *ST)
{
EFI_STATUS status = EFI_SUCCESS;
@@ -33,6 +35,8 @@ EFI_STATUS efi_load_gop(EFI_SYSTEM_TABLE *ST)
if (info->PixelFormat != PixelBlueGreenRedReserved8BitPerColor &&
info->PixelFormat != PixelRedGreenBlueReserved8BitPerColor)
continue;
+ if (info->HorizontalResolution > MAX_H_RES)
+ continue;
if (info->HorizontalResolution > width) {
width = info->HorizontalResolution;
best = i;
diff --git a/kernel/fs/ramfs.c b/kernel/fs/ramfs.c
index e9d5bc2..0c92c96 100644
--- a/kernel/fs/ramfs.c
+++ b/kernel/fs/ramfs.c
@@ -1,5 +1,5 @@
-/*#include <comus/fs.h>
-#include <lib.h>
+#include <comus/fs.h>
+/*#include <lib.h>
//#include <comus/tar.h>
//#include <string.h>
#include <comus/ramfs.h>
@@ -36,7 +36,7 @@ int ramfs_delete(const char *name) {
kfree(allTheFiles[i].data);
for(int j = i; j < numberOfFiles; j++) {
allTheFiles[j] = allTheFiles[j+1];
- numberOfFiles -= 1;
+ numberOfFiles -= 1;
}
return NOERROR;
@@ -62,7 +62,7 @@ int ramfs_write(const char *name, char *buffer) {
}
// here we return the index of the file as well.
-/*int ramfs_find_file(root *r, const char *fullpath, const char *name, file *out, directory *outDirectory) {
+*int ramfs_find_file(root *r, const char *fullpath, const char *name, file *out, directory *outDirectory) {
directory *location = r->root;
if(ramfs_find_directory(r, fullpath, name, location) == NOERROR) {
for(int i = 0; i < location->file_count; i++) {
@@ -89,14 +89,14 @@ int ramfs_find_directory(root *r, const char *fullpath, const char *name, direct
location = location->directories[i];
wasItFound = true;
break;
-
+
}
}
if(!wasItFound) {
return ERROR;
}
tempPath = strtok(NULL, "/");
-
+
}
out = location;
return NOERROR;
@@ -142,7 +142,7 @@ int ramfs_delete_file(root *r, const char *fullpath, const char *name) {
return NOERROR;
}
return ERROR;
-
+
}
return ERROR;
}
@@ -155,7 +155,7 @@ int ramfs_delete_directory() {
}
int ramfs_write() {
-
+
}
diff --git a/kernel/include/comus/limits.h b/kernel/include/comus/limits.h
index 1ef13b4..a036fcb 100644
--- a/kernel/include/comus/limits.h
+++ b/kernel/include/comus/limits.h
@@ -7,7 +7,7 @@
*/
/// number of pts to identity map the kernel (1pt = 2MB)
-#define N_IDENT_PTS 4 // max 512 (1G)
+#define N_IDENT_PTS 64 // max 512 (1G)
/// max number of processes
#define N_PROCS 256
diff --git a/kernel/procs.c b/kernel/procs.c
index d471416..6017e3a 100644
--- a/kernel/procs.c
+++ b/kernel/procs.c
@@ -1,4 +1,3 @@
-#include "lib/kio.h"
#include <comus/drivers/pit.h>
#include <comus/syscalls.h>
#include <comus/memory.h>
diff --git a/kernel/term.c b/kernel/term.c
index 917f645..88fa072 100644
--- a/kernel/term.c
+++ b/kernel/term.c
@@ -7,8 +7,10 @@
// terminal data
static char buffer[TERM_MAX_WIDTH * TERM_MAX_HEIGHT];
static uint16_t buffer_line = UINT16_MAX;
-static uint16_t width = 80; // baseline vga text mode until resized
-static uint16_t height = 25;
+static uint16_t last_width = 80,
+ width = 80; // baseline vga text mode until resized
+static uint16_t last_height = 25, height = 25;
+static uint16_t scrolling = 0;
static uint16_t x = 0;
static uint16_t y = 0;
@@ -140,10 +142,26 @@ void term_redraw(void)
for (uint16_t j = 0; j < height; j++) {
for (uint16_t i = 0; i < width; i++) {
- char c = buffer[BUFIDX(i, j)];
+ char c;
+
+ c = buffer[BUFIDX(i, j)];
+
+ // if screen hasnet changed size
+ // dont redraw what we dont need to redraw
+ if (last_width == height && last_width == width) {
+ char prev;
+ prev = buffer[BUFIDX(i, (j - scrolling))];
+ if (c == prev)
+ continue;
+ }
+
gpu_draw_char(c, i, j);
}
}
+
+ last_width = width;
+ last_height = height;
+ scrolling = 0;
}
void term_scroll(uint16_t lines)
@@ -151,6 +169,8 @@ void term_scroll(uint16_t lines)
if (!lines)
return;
buffer_line += lines;
+ term_clear_line(y);
+ scrolling = lines;
term_redraw();
}