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"
panic
ECHO "Initrc for Kimi's OS"
MODULE boot/idm.elf
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++){
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 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){
@ -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);
// }
}
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("|%d |\n", mmap[i].type);
}

View File

@ -27,16 +27,17 @@ int read_initrd(initrd_t *initrd){
// *out = ptr + 512;
// return filesize;
// }
// printf("size: %d", sizeof(USTAR_file_t));
uint32_t fsize_pgs = (((filesize + 4095)/4096) + 1);
// uint32_t *ptr = kmalloc(fsize_pgs);
// 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/";
strcat(file->filename, final_fname);
fcreate(final_fname, VFILE_POINTER, archive + offset + sizeof(USTAR_file_t), fsize_pgs);
printf("%s, %d, %d\n", final_fname, filesize, 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);
offset += (((filesize + 511) / 512) + 1) * 512;
}
}

View File

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

View File

@ -11,6 +11,7 @@
#include "system/elf.h"
#include "system/vfs.h"
#include "drivers/ustar.h"
#include "system/initrc.h"
kernel_info_t *boot_info = 0;
@ -23,6 +24,11 @@ void sysinit(){
// modules_init(boot_info, 0);
read_initrd(boot_info->initrd);
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);
// int status = fread(drive_test, buffer, 0, 4096);
// if(status == -1){
@ -40,13 +46,13 @@ void sysinit(){
extern void kmain(kernel_info_t *kernel_info){
serial_init();
pm_init(kernel_info);
vfs_init();
mlog("KERNEL", "Initializing IDT\n", MLOG_PRINT);
idt_load();
pic_init(0x20);
pic_disable();
pic_setmask(0x0, PIC1_DATA);
pic_setmask(0x0, PIC2_DATA);
vfs_init();
fcreate("/dev", 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);
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(){
mlog(MODULE_NAME, "Initializing Boot-Time Modules\n", MLOG_PRINT);
// kernel_module_t *module = kernel_info->loaded_modules;

View File

@ -43,4 +43,5 @@ typedef struct module{
void (*fini)(void);
}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*);
vfile->access.data.ptr = ptr;
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);
break;
case VFILE_FILE: