modified some syscall code in rlibc, fs stuff

This commit is contained in:
2026-06-29 17:00:07 -05:00
parent 97357f3170
commit 432d160b7a
285 changed files with 4223 additions and 3957 deletions

View File

@@ -1,4 +1,21 @@
[ [
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/initrd.c.o",
"kernel/initrd.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/initrd.c",
"output": "/home/slinky/source/RockOS/obj/kernel/initrd.c.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -26,12 +43,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/kmain.c.o", "obj/kernel/gdt.c.o",
"kernel/kmain.c" "kernel/gdt.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/kmain.c", "file": "/home/slinky/source/RockOS/kernel/gdt.c",
"output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -50,40 +67,6 @@
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c", "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.c.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/vga/vga.c.o",
"kernel/drivers/vga/vga.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/ide/ide.c.o",
"kernel/drivers/ide/ide.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -128,12 +111,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/gdt.c.o", "obj/kernel/drivers/ide/ide.c.o",
"kernel/gdt.c" "kernel/drivers/ide/ide.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/gdt.c", "file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -145,12 +128,29 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/memory/mm.c.o", "obj/kernel/drivers/vga/vga.c.o",
"kernel/memory/mm.c" "kernel/drivers/vga/vga.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm.c", "file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/scheduler.c.o",
"kernel/scheduler.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/scheduler.c",
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -196,46 +196,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/lib/stream.c.o", "obj/kernel/kmain.c.o",
"kernel/lib/stream.c" "kernel/kmain.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/stream.c", "file": "/home/slinky/source/RockOS/kernel/kmain.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/stream.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/lib/memory.c.o",
"kernel/lib/memory.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/memory.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/lib/print.c.o",
"kernel/lib/print.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/print.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/print.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -264,12 +230,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/scheduler.c.o", "obj/kernel/lib/stream.c.o",
"kernel/scheduler.c" "kernel/lib/stream.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/scheduler.c", "file": "/home/slinky/source/RockOS/kernel/lib/stream.c",
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/stream.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -281,12 +247,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/syscall.S.o", "obj/kernel/lib/print.c.o",
"kernel/syscall.S" "kernel/lib/print.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/syscall.S", "file": "/home/slinky/source/RockOS/kernel/lib/print.c",
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/print.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -298,12 +264,46 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/common.S.o", "obj/kernel/lib/memory.c.o",
"kernel/common.S" "kernel/lib/memory.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/common.S", "file": "/home/slinky/source/RockOS/kernel/lib/memory.c",
"output": "/home/slinky/source/RockOS/obj/kernel/common.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/vfs.c.o",
"kernel/vfs.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/vfs.c",
"output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/memory/mm.c.o",
"kernel/memory/mm.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm.c",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -322,23 +322,6 @@
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S", "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/pit/pit.S.o",
"kernel/drivers/pit/pit.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pit/pit.S.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -366,12 +349,46 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/memory/mm_stubs.S.o", "obj/kernel/drivers/pit/pit.S.o",
"kernel/memory/mm_stubs.S" "kernel/drivers/pit/pit.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm_stubs.S", "file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm_stubs.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pit/pit.S.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/syscall.S.o",
"kernel/syscall.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/syscall.S",
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/interrupts.S.o",
"kernel/interrupts.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/interrupts.S",
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -390,6 +407,23 @@
"file": "/home/slinky/source/RockOS/kernel/boot/boot.S", "file": "/home/slinky/source/RockOS/kernel/boot/boot.S",
"output": "/home/slinky/source/RockOS/obj/kernel/boot/boot.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/boot/boot.S.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/common.S.o",
"kernel/common.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/common.S",
"output": "/home/slinky/source/RockOS/obj/kernel/common.S.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -417,12 +451,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/gdt.S.o", "obj/kernel/memory/mm_stubs.S.o",
"kernel/gdt.S" "kernel/memory/mm_stubs.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/gdt.S", "file": "/home/slinky/source/RockOS/kernel/memory/mm_stubs.S",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm_stubs.S.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -434,11 +468,11 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/interrupts.S.o", "obj/kernel/gdt.S.o",
"kernel/interrupts.S" "kernel/gdt.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/interrupts.S", "file": "/home/slinky/source/RockOS/kernel/gdt.S",
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o"
} }
] ]

View File

@@ -1,3 +1,4 @@
menuentry "RockOS" { menuentry "RockOS" {
multiboot /boot/rockos multiboot /boot/rockos/
module /boot/initrd.img
} }

34
kernel/initrd.c Normal file
View File

@@ -0,0 +1,34 @@
#include "initrd.h"
#include <stdint.h>
#include <lib/print.h>
#include <lib/memory.h>
void parse_cpio(void *initrd_start) {
cpio_header_t *head = (cpio_header_t *)initrd_start;
while (strncmp(head->c_magic, "070701", 6) == 0) {
// If we hit the trailer, we are done
char *filename = (char *)(head + 1);
if (strncmp(filename, "TRAILER!!!", 10) == 0) {
break;
}
uint32_t filesize = parse_hex(head->c_filesize);
uint32_t namesize = parse_hex(head->c_namesize);
kprintf("found file of size %d\n", filesize);
// Calculate where the data begins (accounting for 4-byte padding)
uint32_t header_plus_name = 110 + namesize;
header_plus_name = (header_plus_name + 3) & ~3; // Align to 4 bytes
char *file_data = (char *)head + header_plus_name;
uint32_t total_record_size = header_plus_name + filesize;
total_record_size = (total_record_size + 3) & ~3; // Align to 4 bytes
head = (cpio_header_t *)((char *)head + total_record_size);
}
}

36
kernel/initrd.h Normal file
View File

@@ -0,0 +1,36 @@
#ifndef KINITRD_H
#define KINITRD_H
#include <stdint.h>
typedef struct {
char c_magic[6];
char c_ino[8];
char c_mode[8];
char c_uid[8];
char c_gid[8];
char c_nlink[8];
char c_mtime[8];
char c_filesize[8];
char c_devmajor[8];
char c_devminor[8];
char c_rdevmajor[8];
char c_rdevminor[8];
char c_namesize[8];
char c_check[8];
} cpio_header_t;
static inline uint32_t parse_hex(const char *s) {
uint32_t val = 0;
for (int i = 0; i < 8; i++) {
val <<= 4;
if (s[i] >= '0' && s[i] <= '9') val += (s[i] - '0');
else if (s[i] >= 'A' && s[i] <= 'F') val += (s[i] - 'A' + 10);
else if (s[i] >= 'a' && s[i] <= 'f') val += (s[i] - 'a' + 10);
}
return val;
}
void parse_cpio(void *initrd_start);
#endif

View File

@@ -3,6 +3,7 @@
#include "gdt.h" #include "gdt.h"
#include "scheduler.h" #include "scheduler.h"
#include "common.h" #include "common.h"
#include "initrd.h"
#include <lib/print.h> #include <lib/print.h>
#include <lib/stream.h> #include <lib/stream.h>
@@ -23,15 +24,32 @@
extern char __kernel_start; extern char __kernel_start;
extern char __kernel_end; extern char __kernel_end;
void first_task() { void parse_multiboot_modules(uint32_t mbi_vaddr) {
kprintf("task started\n"); // find where grub put the boot module containing initrd
int i = 5; multiboot_info* mbi = (multiboot_info*)mbi_vaddr;
while (i--) {
sleep(1000); uint32_t mod_count = mbi->mods_count;
kprintf("task awake [%d]\n", i); multiboot_module_t* mod = (multiboot_module_t*)((uint32_t)mbi->mods_addr + 0xC0000000);
kprintf("found %d mods starting @ [v]0x%x\n", mod_count, (uint32_t)mod);
for (uint32_t i = 0; i < mod_count; i++) {
uint32_t start = mod[i].mod_start;
uint32_t end = mod[i].mod_end;
uint32_t cmdline = mod[i].cmdline;
multiboot_module_info_table[i].mod_start = start + 0xC0000000;
multiboot_module_info_table[i].mod_end = end + 0xC0000000;
multiboot_module_info_table[i].cmdline = cmdline + 0xC0000000;
} }
kprintf("exiting\n"); }
exit();
void load_initrd() {
multiboot_module_t* initrd_module = &multiboot_module_info_table[0];
kprintf("initrd found @ [v] 0x%x\n", initrd_module->mod_start);
kprintf("reading initrd\n");
parse_cpio((void*)initrd_module->mod_start);
} }
void kmain(uint32_t magic, multiboot_info* mbi) { void kmain(uint32_t magic, multiboot_info* mbi) {
@@ -53,16 +71,13 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
init_page_tables(); init_page_tables();
parse_multiboot_modules((uint32_t)mbi);
load_initrd();
kprintf("basic initializations complete\n"); kprintf("basic initializations complete\n");
disable_interrupts(); // just paranoid... do it again disable_interrupts(); // just paranoid... do it again
init_scheduler(); init_scheduler();
enable_interrupts(); enable_interrupts();
create_task((uint32_t)first_task, fetch_cr3());
while(1) {
sleep(5000);
kprintf("kernel awake\n");
}
} }

View File

@@ -38,6 +38,26 @@ int strlen(const char* str) {
return len; return len;
} }
int strncmp(const char *s1, const char *s2, size_t n) {
// If n is 0, we don't compare anything and strings are "equal"
while (n > 0) {
// If characters don't match, or we hit the null-terminator of s1
if (*s1 != *s2) {
return *(unsigned char *)s1 - *(unsigned char *)s2;
}
// If we reached the end of the strings simultaneously
if (*s1 == '\0') {
break;
}
s1++;
s2++;
n--;
}
return 0;
}
static void* kernel_heap_start = (void*)KHEAP_START; static void* kernel_heap_start = (void*)KHEAP_START;
static void* kernel_heap_end = (void*)KHEAP_START; static void* kernel_heap_end = (void*)KHEAP_START;
alloc_header_t* blk_list = NULL; alloc_header_t* blk_list = NULL;

View File

@@ -8,6 +8,7 @@ void memcpy(const void* src, void* dst, size_t sz);
void memset(const uint8_t* dst, uint8_t val, size_t sz); void memset(const uint8_t* dst, uint8_t val, size_t sz);
int strcmp(const char *s1, const char *s2); int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
int strlen(const char* str); int strlen(const char* str);
void kgrow(size_t pages); void kgrow(size_t pages);

View File

@@ -109,7 +109,7 @@ void* p_alloc_frame() {
return 0; return 0;
} }
static void p_free_frame(void* addr) { void p_free_frame(void* addr) {
mark_free((uint32_t)addr); mark_free((uint32_t)addr);
} }

3
kernel/multiboot.c Normal file
View File

@@ -0,0 +1,3 @@
#include "multiboot.h"
multiboot_module_t multiboot_module_info_table[32];

View File

@@ -31,6 +31,8 @@ typedef struct {
uint32_t mod_end; // Physical end address of user.elf uint32_t mod_end; // Physical end address of user.elf
uint32_t cmdline; // Pointer to a string (e.g., "/boot/user.elf") uint32_t cmdline; // Pointer to a string (e.g., "/boot/user.elf")
uint32_t pad; uint32_t pad;
} __attribute__((packed)) multiboot_module_entry; } __attribute__((packed)) multiboot_module_t;
extern multiboot_module_t multiboot_module_info_table[32];
#endif #endif

View File

@@ -17,6 +17,7 @@ typedef struct {
process_state_t state; process_state_t state;
uint32_t sleep; uint32_t sleep;
void* next; void* next;
uint32_t heap_end;
} __attribute__((packed)) process_t; } __attribute__((packed)) process_t;
#endif #endif

View File

@@ -137,6 +137,13 @@ int create_task(uint32_t entry_point, uint32_t cr3) {
return 1; return 1;
} }
process_t* current_task() {
lock_scheduler();
process_t* rtn = &process_table[current_process];
unlock_scheduler();
return rtn;
}
void sleep(uint32_t ms) { void sleep(uint32_t ms) {
if (ms == 0) return; if (ms == 0) return;
lock_scheduler(); lock_scheduler();

View File

@@ -1,11 +1,13 @@
#ifndef KSCHEDULER_H #ifndef KSCHEDULER_H
#define KSCHEDULER_H #define KSCHEDULER_H
#include "process.h"
#include <stdint.h> #include <stdint.h>
void init_scheduler(); void init_scheduler();
int create_task(uint32_t entry_point, uint32_t cr3); int create_task(uint32_t entry_point, uint32_t cr3);
process_t* current_task();
void sleep(uint32_t ms); void sleep(uint32_t ms);
void yield(); void yield();

View File

@@ -1,7 +1,12 @@
#include <stdint.h> #include <stdint.h>
#include <stddef.h>
#include "memory/mm.h"
#include "process.h"
#include "scheduler.h" #include "scheduler.h"
#include <drivers/vga/vga.h>
typedef struct registers { typedef struct registers {
uint32_t gs, fs, es, ds; // Pushed manually uint32_t gs, fs, es, ds; // Pushed manually
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; // Pushed by pusha uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; // Pushed by pusha
@@ -9,35 +14,81 @@ typedef struct registers {
uint32_t eip, cs, eflags, useresp, ss; // Pushed automatically by CPU uint32_t eip, cs, eflags, useresp, ss; // Pushed automatically by CPU
} registers_t; } registers_t;
int32_t sys_exit();
int32_t sys_read();
int32_t sys_write();
int32_t sys_open();
int32_t sys_close();
int32_t sys_brk();
int32_t syscall(registers_t* regs) { static int32_t sys_exit(int status) {
switch(regs->eax) {
case 1: return sys_exit();
case 3: return sys_read();
case 4: return sys_write();
case 5: return sys_open();
case 6: return sys_close();
case 12: return sys_brk();
default:
return -1;
}
}
int32_t sys_exit() {
exit(); exit();
return 0; return 0;
} }
int32_t sys_read() { static int32_t sys_write(int fd, const void* buf, size_t count) {
return 0; if (fd == 1 || fd == 2) { // stdout or stderr
const char* cbuf = (const char*)buf;
for (size_t i = 0; i < count; i++) {
vga_putchar(cbuf[i]);
}
return count;
}
return -1;
} }
int32_t sys_write() { static int32_t sys_read(int fd, void* buf, size_t count) {
return 0; if (fd == 0) { // stdin
char* cbuf = (char*)buf;
size_t bytes_read = 0;
while (bytes_read < count) {
char c = 'r';
cbuf[bytes_read++] = c;
if (c == '\n') break;
}
return bytes_read;
}
return -1;
}
static int32_t sys_open(const char* filename, int flags) {
return -1;
}
static int32_t sys_close(int fd) {
return -1;
}
static int32_t sys_brk(uint32_t new_break) {
process_t* current = current_task();
if (new_break == 0) {
return current->heap_end;
}
if (new_break < current->heap_end) {
current->heap_end = new_break;
return current->heap_end;
}
uint32_t page_start = (current->heap_end + 4095) & ~4095;
uint32_t page_end = (new_break + 4095) & ~4095;
for (uint32_t addr = page_start; addr < page_end; addr += 4096) {
// 1. Allocate a physical frame using your PMM (Physical Memory Manager)
void* phys = p_alloc_frame();
// 2. Map it into the current page directory using your VMM (Virtual Memory Manager)
map_page(addr, (uint32_t)phys, PAGE_PRESENT | PAGE_WRITABLE | PAGE_USER);
}
current->heap_end = new_break;
return current->heap_end;
}
int32_t syscall(registers_t* regs) {
switch(regs->eax) {
case 1: return sys_exit(regs->ebx);
case 3: return sys_read(regs->ebx, (void*)regs->ecx, regs->edx);
case 4: return sys_write(regs->ebx, (const void*)regs->ecx, regs->edx);
case 5: return sys_open((const char*)regs->ebx, regs->ecx);
case 6: return sys_close(regs->ebx);
case 12: return sys_brk(regs->ebx);
default:
return -1;
}
} }

12
kernel/vfs.c Normal file
View File

@@ -0,0 +1,12 @@
#include "vfs.h"
#include "lib/memory.h"
#include <string.h>
vfs_node_t* root = NULL;
void vfs_create_root() {
root = kalloc(sizeof(vfs_node_t));
memset((uint8_t*)root->name, 0, 128);
memcpy("root", root->name, 4);
root->flags |= VFS_DIRECTORY;
}

30
kernel/vfs.h Normal file
View File

@@ -0,0 +1,30 @@
#ifndef KVFS_H
#define KVFS_H
#include <stdint.h>
#define VFS_FILE 0x01
#define VFS_DIRECTORY 0x02
struct vfs_node;
typedef uint32_t (*read_type_t)(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer);
typedef uint32_t (*write_type_t)(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer);
typedef struct vfs_node* (*finddir_type_t)(struct vfs_node* node, const char* name);
typedef struct vfs_node {
char name[128];
uint32_t flags; // File, directory, device, etc.
uint32_t size; // Size of file in bytes
uint32_t inode; // Unique identifier managed by the specific filesystem
read_type_t read;
write_type_t write;
finddir_type_t finddir;
struct vfs_node* mount;
} vfs_node_t;
void vfs_create_root();
#endif

Some files were not shown because too many files have changed in this diff Show More