diff --git a/initrc.conf b/initrc.conf index a62b0e4..8611be3 100644 --- a/initrc.conf +++ b/initrc.conf @@ -1,3 +1,5 @@ -echo "This is a test" - -panic \ No newline at end of file +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 diff --git a/src/kernel/arch_i386/memory.c b/src/kernel/arch_i386/memory.c index 37c2295..5dd96cc 100644 --- a/src/kernel/arch_i386/memory.c +++ b/src/kernel/arch_i386/memory.c @@ -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); } diff --git a/src/kernel/drivers/ustar.c b/src/kernel/drivers/ustar.c index f218bbc..2b91eff 100644 --- a/src/kernel/drivers/ustar.c +++ b/src/kernel/drivers/ustar.c @@ -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; } } \ No newline at end of file diff --git a/src/kernel/drivers/ustar.h b/src/kernel/drivers/ustar.h index b3b0b9f..4cceabd 100644 --- a/src/kernel/drivers/ustar.h +++ b/src/kernel/drivers/ustar.h @@ -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{ diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 585774a..2083278 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -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); diff --git a/src/kernel/system/initrc.h b/src/kernel/system/initrc.h new file mode 100644 index 0000000..ac98c1e --- /dev/null +++ b/src/kernel/system/initrc.h @@ -0,0 +1 @@ +void initrc_read(char *file); \ No newline at end of file diff --git a/src/kernel/system/intirc.c b/src/kernel/system/intirc.c new file mode 100644 index 0000000..f9c263a --- /dev/null +++ b/src/kernel/system/intirc.c @@ -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++; + } +} \ No newline at end of file diff --git a/src/kernel/system/modules.c b/src/kernel/system/modules.c index 48c4f71..8bd73fa 100644 --- a/src/kernel/system/modules.c +++ b/src/kernel/system/modules.c @@ -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; diff --git a/src/kernel/system/modules.h b/src/kernel/system/modules.h index d7df4ee..5b17f3b 100644 --- a/src/kernel/system/modules.h +++ b/src/kernel/system/modules.h @@ -43,4 +43,5 @@ typedef struct module{ void (*fini)(void); }module_t; -void modules_init(); \ No newline at end of file +void modules_init(); +void module_start(void *ptr); \ No newline at end of file diff --git a/src/kernel/system/vfs.c b/src/kernel/system/vfs.c index 2bc9d11..e32876b 100644 --- a/src/kernel/system/vfs.c +++ b/src/kernel/system/vfs.c @@ -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: