working on filesystem

This commit is contained in:
notsomeidiot123 2026-03-05 18:56:15 -05:00
parent 5c58761a2a
commit a461dac04e
8 changed files with 86 additions and 29 deletions

View File

@ -29,15 +29,15 @@ void sysinit(){
} }
modules_init(); modules_init();
initrc_read(initrc); initrc_read(initrc);
vfile_t *disk_dir = fget_file("/dev/disk"); // vfile_t *disk_dir = fget_file("/dev/disk");
if(disk_dir == 0){ // if(disk_dir == 0){
mlog("KERNEL", "Error: /dev/disk does not exist\n", MLOG_PRINT); // mlog("KERNEL", "Error: /dev/disk does not exist\n", MLOG_PRINT);
} // }
vfile_t **dir_data = disk_dir->access.data.ptr; // vfile_t **dir_data = disk_dir->access.data.ptr;
for(uint32_t i = 0; dir_data[i]; i++){ // for(uint32_t i = 0; dir_data[i]; i++){
mlog("KERNEL", "Filename: %s\n", MLOG_PRINT, dir_data[i]->name); // mlog("KERNEL", "Filename: %s\n", MLOG_PRINT, dir_data[i]->name);
vfs_detect_partitions(dir_data[i]); // vfs_detect_partitions(dir_data[i]);
} // }
// dispatch_message(0); // dispatch_message(0);
printf("Bleh\n"); printf("Bleh\n");
//why did i stop working on this? what was wrong with this? //why did i stop working on this? what was wrong with this?

View File

@ -85,10 +85,10 @@ void vector_push(vector_t *vector, void *new_element){
for(uint8_t i = 0; i < (vector->size - 1) * vector->sizeof_elements; i++){ for(uint8_t i = 0; i < (vector->size - 1) * vector->sizeof_elements; i++){
((uint8_t *)(newptr))[i] = ((uint8_t *)vector->ptr)[i * vector->size]; ((uint8_t *)(newptr))[i] = ((uint8_t *)vector->ptr)[i * vector->size];
} }
void *tmp = vector->ptr;
kfree(tmp);
} }
void *tmp = vector->ptr;
vector->ptr = newptr; vector->ptr = newptr;
kfree(tmp);
} }
for(uint32_t i = 0; i < vector->sizeof_elements; i++){ for(uint32_t i = 0; i < vector->sizeof_elements; i++){
((uint8_t *)(vector->ptr))[vector->size * vector->sizeof_elements + i] = ((uint8_t *)new_element)[i]; ((uint8_t *)(vector->ptr))[vector->size * vector->sizeof_elements + i] = ((uint8_t *)new_element)[i];

View File

@ -116,7 +116,10 @@ void initrc_read(vfile_t *file){
// printf("TEST: %s, %s, %d\n", mount_src_name, mount_dest, ptr[i]); // printf("TEST: %s, %s, %d\n", mount_src_name, mount_dest, ptr[i]);
vfile_t *to_mount = fget_file(mount_src_name); vfile_t *to_mount = fget_file(mount_src_name);
dispatch_message(MESSAGE_MOUNT_FS, to_mount, mount_dest, offset); if(!dispatch_message(MESSAGE_MOUNT_FS, to_mount, mount_dest, offset)){
mlog("INITRC", "Error: Could not mount device %s at %s", MLOG_PRINT, mount_src_name, mount_dest);
asm("int $13");
}
} }
else if(!strcmp(statement, "END")){ else if(!strcmp(statement, "END")){
return; return;

View File

@ -156,7 +156,7 @@ uint32_t module_api(uint32_t func, ...){
void dispatch_message(uint32_t message, ...){ uint32_t dispatch_message(uint32_t message, ...){
va_list args; va_list args;
va_start(args, message); va_start(args, message);
@ -180,12 +180,13 @@ void dispatch_message(uint32_t message, ...){
result = handler(message, srcfile, destname, offset); result = handler(message, srcfile, destname, offset);
break; break;
} }
if((int32_t) message > 0 && result){ if((int32_t) message >= 0 && result){
break; va_end(args);
return result;
} }
} }
va_end(args); va_end(args);
return 0;
} }
void module_start(void *ptr){ void module_start(void *ptr){

View File

@ -44,7 +44,6 @@ enum MESSAGES{
MESSAGE_BROADCAST = 0x80000000, //placeholder MESSAGE_BROADCAST = 0x80000000, //placeholder
}; };
void dispatch_message(uint32_t message, ...);
typedef struct module{ typedef struct module{
void *init_entry; void *init_entry;
@ -57,5 +56,6 @@ typedef struct module{
void (*fini)(void); void (*fini)(void);
}module_t; }module_t;
uint32_t dispatch_message(uint32_t message, ...);
void modules_init(); void modules_init();
void module_start(void *ptr); void module_start(void *ptr);

View File

@ -17,20 +17,38 @@ module_t module_data = {
0, 0,
}; };
// void mount_fat32(vfile_t *dev_file, char *destination){ uint8_t fat32_check_valid(fat32_bpb_t *bpb){
return bpb->signature == 0x28 || bpb->signature == 0x29;
}
uint32_t fat32_mount(vfile_t *dev_file, char *destination, uint32_t offset){
char *bpb_buffer = malloc(api, 1);
fread(api, dev_file, bpb_buffer, offset, 4096);
fat32_bpb_t *bpb = bpb_buffer;
// } api(MODULE_API_PRINT, MODULE_NAME, "Sizeof struct: %d, sig: %x, boot sig: %x\n", sizeof(fat32_bpb_t), bpb->signature, bpb->bootable_sig);
if(!fat32_check_valid(bpb)){
api(MODULE_API_PRINT, MODULE_NAME, "Error: No valid BPB\n");
return 0;
}
return 1;
}
int32_t message_handler(uint32_t message, ...){ int32_t message_handler(uint32_t message, ...){
puts(api, MODULE_NAME, "Called message handler!\n"); puts(api, MODULE_NAME, "Called message handler!\n");
va_list args;
va_start(args, message);
if(message == MESSAGE_MOUNT_FS){
vfile_t *device = va_arg(args, vfile_t *);
char *dest = va_arg(args, char *);
uint32_t offset = va_arg(args, uint32_t);
return fat32_mount(device, dest, offset);
}
return -1; return -1;
} }
int phony_read(vfile_t *file, char*buffer, uint32_t offset, uint32_t count){
return 0;
}
void init(KOS_MAPI_FP module_api, uint32_t api_version){ void init(KOS_MAPI_FP module_api, uint32_t api_version){
api = module_api; api = module_api;
api(MODULE_API_PRINT, MODULE_NAME, "KIFSM Filesystem Driver Module v0.1.0\nSupported Filesystems:\n"); api(MODULE_API_PRINT, MODULE_NAME, "KIFSM Filesystem Driver Module v0.1.0\nSupported Filesystems:\n");

View File

@ -1,2 +1,36 @@
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
typedef struct fat32_bpb{
//fat12/fat16 bpb
char nop[3];
char oem[8];
uint16_t bytes_per_sector;
uint8_t sectors_per_cluster;
uint16_t reserved_sectors;
uint8_t fat_count;
uint16_t root_dir_entries;
uint16_t sectors_small;
uint8_t media;
uint16_t sectors_per_fat_16;
uint16_t sectors_per_track;
uint16_t heads;
uint32_t partition_start;
uint32_t sector_count;
//fat32 exclusive
uint32_t sectors_per_fat;
uint16_t flags;
uint16_t fat_version;
uint32_t root_dir_cluster;
uint16_t fsinfo_sector;
uint16_t backup_bpb_sector;
uint8_t reserved[12];
uint8_t drive_no;
uint8_t ntflags;
uint8_t signature; //must be 0x28 or 0x29
uint32_t serial_id;
char label[11];
char system_id[8];
char boot_code[420];
uint16_t bootable_sig;
}__attribute__((packed)) fat32_bpb_t;

View File

@ -47,10 +47,11 @@ typedef struct cpu_registers{
uint32_t eip, cs, eflags, useresp, ss; uint32_t eip, cs, eflags, useresp, ss;
}__attribute__((packed))cpu_registers_t; }__attribute__((packed))cpu_registers_t;
typedef enum mount_ops{ enum MESSAGES{
MOUNT_NEW, MESSAGE_MOUNT_FS,
MOUNT_UNMOUNT, MESSAGE_UNMOUNT_FS,
}MOUNT_OPERATION; MESSAGE_BROADCAST = 0x80000000, //placeholder
};
typedef enum vfile_type{ typedef enum vfile_type{
VFILE_NULL, VFILE_NULL,