rudimentary initrc parser

This commit is contained in:
notsomeidiot123 2025-09-29 10:45:26 -04:00
parent 95f55f1623
commit 97708379f6
10 changed files with 97 additions and 17 deletions

View File

@ -1,3 +1,5 @@
echo "This is a test" ECHO "Initrc for Kimi's OS"
MODULE boot/idm.elf
panic MODULE boot/ifsm.elf
# This is a comment
END # does nothing but make the whole thing slightly more efficient

View File

@ -64,7 +64,7 @@ int pm_init(kernel_info_t *kernel_info){
for(uint32_t i = 0; i < mmap_count; i++){ for(uint32_t i = 0; i < mmap_count; i++){
pm_map[i] = 0xff; pm_map[i] = 0xff;
} }
mlog("KERNEL", " BASE | LENGTH | TYPE\n --------|--------|----\n", MLOG_PRINT); // mlog("KERNEL", " BASE | LENGTH | TYPE\n --------|--------|----\n", MLOG_PRINT);
for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){ for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){
for(uint32_t j = 0; j < (mmap[i].entry_length >> 12); j++){ for(uint32_t j = 0; j < (mmap[i].entry_length >> 12); j++){
if(mmap[i].entry_base + (j << 12) <= mmap[i-1].entry_base + mmap[i-1].entry_length){ if(mmap[i].entry_base + (j << 12) <= mmap[i-1].entry_base + mmap[i-1].entry_length){
@ -83,7 +83,7 @@ int pm_init(kernel_info_t *kernel_info){
// printf("%d, %x, %d\n", j >> 3, pm_map[(mmap[i].entry_base >> 12 ) + (j >> 3)], mmap[i].type); // printf("%d, %x, %d\n", j >> 3, pm_map[(mmap[i].entry_base >> 12 ) + (j >> 3)], mmap[i].type);
// } // }
} }
mlog("KERNEL", " %x|%x|%d\n", MLOG_PRINT, (uint32_t)mmap[i].entry_base, (uint32_t)mmap[i].entry_length, mmap[i].type); // mlog("KERNEL", " %x|%x|%d\n", MLOG_PRINT, (uint32_t)mmap[i].entry_base, (uint32_t)mmap[i].entry_length, mmap[i].type);
// printf("%x", mmap[i].entry_length); // printf("%x", mmap[i].entry_length);
// printf("|%d |\n", mmap[i].type); // printf("|%d |\n", mmap[i].type);
} }

View File

@ -27,16 +27,17 @@ int read_initrd(initrd_t *initrd){
// *out = ptr + 512; // *out = ptr + 512;
// return filesize; // return filesize;
// } // }
// printf("size: %d", sizeof(USTAR_file_t));
uint32_t fsize_pgs = (((filesize + 4095)/4096) + 1); uint32_t fsize_pgs = (((filesize + 4095)/4096) + 1);
// uint32_t *ptr = kmalloc(fsize_pgs); // uint32_t *ptr = kmalloc(fsize_pgs);
// for(uint32_t i = 0; i < (filesize/4) + 1; i++){ // for(uint32_t i = 0; i < (filesize/4) + 1; i++){
// ptr[i] = ((uint32_t *)(archive + offset))[i]; // ptr[i] = ((uint32_t *)(archive + offset + sizeof(USTAR_file_t)))[i];
// if(fsize_pgs == 2)printf("%x", ptr[i]);
// } // }
char final_fname[80] = "/boot/"; char final_fname[80] = "/boot/";
strcat(file->filename, final_fname); strcat(file->filename, final_fname);
fcreate(final_fname, VFILE_POINTER, archive + offset + sizeof(USTAR_file_t), fsize_pgs); fcreate(final_fname, VFILE_POINTER, (archive + offset + sizeof(USTAR_file_t)), fsize_pgs);
printf("%s, %d, %d\n", final_fname, filesize, fsize_pgs); // printf("%s, %d, %d\n", final_fname, filesize, fsize_pgs);
offset += (((filesize + 511) / 512) + 1) * 512; offset += (((filesize + 511) / 512) + 1) * 512;
} }
} }

View File

@ -3,12 +3,12 @@
#include "../shared/kstdlib.h" #include "../shared/kstdlib.h"
typedef struct{ typedef struct{
char filename[100]; char filename[100];
uint64_t mode; char mode[8];
uint64_t owner_uid; char owner_uid[8];
uint64_t group_uid; char group_uid[8];
char fsize[12]; char fsize[12];
char last_modified[12]; char last_modified[12];
uint64_t checksum; char checksum[8];
uint8_t type; uint8_t type;
char linked_file[100]; char linked_file[100];
char ustar[6]; char ustar[6];
@ -18,6 +18,7 @@ typedef struct{
char dev_major[8]; char dev_major[8];
char dev_minor[8]; char dev_minor[8];
char filename_prefix[155]; char filename_prefix[155];
char reserved[12];
}__attribute__((packed)) USTAR_file_t; }__attribute__((packed)) USTAR_file_t;
enum USTAR_TYPES{ enum USTAR_TYPES{

View File

@ -11,6 +11,7 @@
#include "system/elf.h" #include "system/elf.h"
#include "system/vfs.h" #include "system/vfs.h"
#include "drivers/ustar.h" #include "drivers/ustar.h"
#include "system/initrc.h"
kernel_info_t *boot_info = 0; kernel_info_t *boot_info = 0;
@ -23,6 +24,11 @@ void sysinit(){
// modules_init(boot_info, 0); // modules_init(boot_info, 0);
read_initrd(boot_info->initrd); read_initrd(boot_info->initrd);
vfile_t *initrc = fopen("/boot/initrc.conf"); vfile_t *initrc = fopen("/boot/initrc.conf");
if(initrc){
mlog("KERNEL", "Found initrc at: %x\n", MLOG_PRINT, initrc->access.data.ptr);
}
modules_init();
initrc_read(initrc);
// uint8_t *buffer = kmalloc(1); // uint8_t *buffer = kmalloc(1);
// int status = fread(drive_test, buffer, 0, 4096); // int status = fread(drive_test, buffer, 0, 4096);
// if(status == -1){ // if(status == -1){
@ -40,13 +46,13 @@ void sysinit(){
extern void kmain(kernel_info_t *kernel_info){ extern void kmain(kernel_info_t *kernel_info){
serial_init(); serial_init();
pm_init(kernel_info); pm_init(kernel_info);
vfs_init();
mlog("KERNEL", "Initializing IDT\n", MLOG_PRINT); mlog("KERNEL", "Initializing IDT\n", MLOG_PRINT);
idt_load(); idt_load();
pic_init(0x20); pic_init(0x20);
pic_disable(); pic_disable();
pic_setmask(0x0, PIC1_DATA); pic_setmask(0x0, PIC1_DATA);
pic_setmask(0x0, PIC2_DATA); pic_setmask(0x0, PIC2_DATA);
vfs_init();
fcreate("/dev", VFILE_DIRECTORY, kmalloc(1), 1); fcreate("/dev", VFILE_DIRECTORY, kmalloc(1), 1);
fcreate("/dev/disk", VFILE_DIRECTORY, kmalloc(1), 1); fcreate("/dev/disk", VFILE_DIRECTORY, kmalloc(1), 1);

View File

@ -0,0 +1 @@
void initrc_read(char *file);

View File

@ -0,0 +1,64 @@
#include "../shared/kstdlib.h"
#include "../shared/memory.h"
#include "../shared/string.h"
#include "modules.h"
#include "vfs.h"
//COMMANDS TO WRITE:
//link: create symlink from one file to another (useful for actually selecting where to mount things)
//exec: execute program in userspace
void initrc_read(vfile_t *file){
mlog("KERNEL", "Reading initrc:\n", MLOG_PRINT);
char *ptr = file->access.data.ptr;
uint32_t size = file->access.data.size_pgs * 4096;
char statement[512];
uint32_t i = 0;
while(strcmp(statement, "END")){
uint32_t s_i = 0;
while(ptr[i] != ' ' && ptr[i] != '\n' && ptr[i]){
statement[s_i++] = ptr[i];
i++;
}
statement[s_i]=0;
if(statement[0] == '#'){
while(ptr[i] != '\n' && ptr[i]){
i++;
}
}
if(!strcmp(statement, "ECHO")){
//this is purely for testing purposes.
i++;
while(ptr[i] != '\n' && ptr[i]){
if(ptr[i] != '\"'){
printf("%c", ptr[i]);
}
i++;
}
printf("\n");
}
if(!strcmp(statement, "MODULE")){
i++;
char module_name[512];
int j = 0;
for(; j < 512 && ptr[i + j] && ptr[i+j] != '\n'; j++){
module_name[j] = ptr[i + j];
}
i+=j;
module_name[j] = 0;
// printf("%s\n", module_name);
vfile_t *module = fopen(module_name);
if(!module){
printf("Error: Could not find module in Initrc.conf: %s\n", module_name);
continue;
}
module_start(module->access.data.ptr);
}
// printf("%d\n", i);
if(i >= size){
return;
}
i++;
}
}

View File

@ -128,7 +128,10 @@ uint32_t module_api(uint32_t func, ...){
va_end(vars); va_end(vars);
return return_value; return return_value;
} }
void module_start(void *ptr){
void (*entry)(void* api, uint32_t version) = load_elf(ptr, PT_SYS);
(*entry)(module_api, 0);
}
void modules_init(){ void modules_init(){
mlog(MODULE_NAME, "Initializing Boot-Time Modules\n", MLOG_PRINT); mlog(MODULE_NAME, "Initializing Boot-Time Modules\n", MLOG_PRINT);
// kernel_module_t *module = kernel_info->loaded_modules; // kernel_module_t *module = kernel_info->loaded_modules;

View File

@ -44,3 +44,4 @@ typedef struct module{
}module_t; }module_t;
void modules_init(); void modules_init();
void module_start(void *ptr);

View File

@ -79,7 +79,8 @@ vfile_t *fcreate(char *name, VFILE_TYPE type, ...){
void *ptr = va_arg(args, void*); void *ptr = va_arg(args, void*);
vfile->access.data.ptr = ptr; vfile->access.data.ptr = ptr;
vfile->access.data.size_pgs = va_arg(args, uint32_t); vfile->access.data.size_pgs = va_arg(args, uint32_t);
*(uint32_t *)ptr = 0; // *(uint32_t *)(ptr + (vfile->access.data.size_pgs * 4096)) = 0;
// what was the above line even for
add_file(vfile, current_dir); add_file(vfile, current_dir);
break; break;
case VFILE_FILE: case VFILE_FILE: