void createProcess(struct Process* process, EntryPoint entryPoint, struct Process* parent, char* args, int terminal, int kernel) { process->pid = ++pid; process->kernel = !!kernel; process->terminal = terminal; process->active = 0; process->parent = parent; process->firstChild = NULL; process->cycles = 0; process->curr_cycles = 0; process->prev_cycles = 0; process->timeStart = _time(NULL); process->uid = 0; process->gid = 0; if (parent != NULL) { process->uid = parent->uid; process->gid = parent->gid; } process->prev = NULL; if (parent == NULL) { process->ppid = 0; process->next = NULL; process->cwd = kalloc(2 * sizeof(char)); strcpy(process->cwd, "/"); } else { process->ppid = parent->pid; process->next = parent->firstChild; if (parent->firstChild) { parent->firstChild->prev = process; } parent->firstChild = process; process->cwd = kalloc(strlen(parent->cwd) + 1); strcpy(process->cwd, parent->cwd); } process->entryPoint = entryPoint; if (args == NULL) { process->args[0] = 0; } else { int i; for (i = 0; *(args + i) && i < ARGV_SIZE - 1; i++) { process->args[i] = args[i]; } process->args[i] = 0; } process->schedule.priority = 2; process->schedule.status = StatusReady; process->schedule.inWait = 0; process->schedule.ioWait = 0; process->schedule.done = 0; for (size_t i = 0; i < MAX_OPEN_FILES; i++) { if (parent && parent->fdTable[i].inode) { fs_dup(&process->fdTable[i], parent->fdTable[i]); } else { process->fdTable[i].inode = NULL; } } { process->mm.pagesInKernelStack = KERNEL_STACK_PAGES; struct Pages* mem = reserve_pages(process, process->mm.pagesInKernelStack); assert(mem != NULL); process->mm.esp0 = (char*)mem->start + PAGE_SIZE * process->mm.pagesInKernelStack; process->mm.kernelStack = process->mm.esp0; } if (kernel) { process->mm.pagesInHeap = 0; process->mm.mallocContext = NULL; } else { process->mm.pagesInHeap = 256; struct Pages* mem = reserve_pages(process, process->mm.pagesInHeap); assert(mem != NULL); process->mm.mallocContext = mm_create_context(mem->start, process->mm.pagesInHeap * PAGE_SIZE); mem_check(); } if (!kernel) { process->mm.pagesInStack = 16; struct Pages* mem = reserve_pages(process, process->mm.pagesInStack); assert(mem != NULL); process->mm.esp = (char*)mem->start + PAGE_SIZE * process->mm.pagesInStack; } else { process->mm.pagesInStack = 0; process->mm.esp = NULL; } setup_page_directory(process, kernel); if (!kernel) { struct Pages* ungetPage = reserve_pages(process, 1); assert(ungetPage != NULL); mm_pagination_map(process, (unsigned int)ungetPage->start, (unsigned int)STACK_TOP_MAPPING, 1, 1, 1); FILE* files; for (int i = 0; i < 3; i++) { files = ungetPage->start + i * sizeof(FILE); files->fd = i; files->flag = 0; files->unget = 0; } } int codeSegment, dataSegment; if (kernel) { codeSegment = KERNEL_CODE_SEGMENT; dataSegment = KERNEL_DATA_SEGMENT; char* esp0 = (char*) process->mm.esp0 - ARGV_SIZE; for (size_t i = 0; i < ARGV_SIZE; i++) { esp0[i] = process->args[i]; } process->mm.esp0 = esp0; push((unsigned int**) &process->mm.esp0, (unsigned int) process->mm.esp0); push((unsigned int**) &process->mm.esp0, (unsigned int) exit); push((unsigned int**) &process->mm.esp0, 0x202); } else { codeSegment = USER_CODE_SEGMENT; dataSegment = USER_DATA_SEGMENT; char* esp = (char*) process->mm.esp - ARGV_SIZE; for (size_t i = 0; i < ARGV_SIZE; i++) { esp[i] = process->args[i]; } process->mm.esp = esp; push((unsigned int**) &process->mm.esp, STACK_TOP_MAPPING - ARGV_SIZE); push((unsigned int**) &process->mm.esp, (unsigned int) exit); push((unsigned int**) &process->mm.esp0, dataSegment); push((unsigned int**) &process->mm.esp0, STACK_TOP_MAPPING - 2 * sizeof(int) - ARGV_SIZE); push((unsigned int**) &process->mm.esp0, 0x3202); } push((unsigned int**) &process->mm.esp0, codeSegment); push((unsigned int**) &process->mm.esp0, (unsigned int) entryPoint); push((unsigned int**) &process->mm.esp0, dataSegment); push((unsigned int**) &process->mm.esp0, dataSegment); push((unsigned int**) &process->mm.esp0, dataSegment); push((unsigned int**) &process->mm.esp0, dataSegment); push((unsigned int**) &process->mm.esp0, (unsigned int) _interruptEnd); push((unsigned int**) &process->mm.esp0, (unsigned int) signalPIC); push((unsigned int**) &process->mm.esp0, 0); }
void fs_test(int tid) { fun_string f[25]; unsigned char d1[] = "kungfu\0kaleidescopes", d2[] = "funintheSun"; size_t count; printf("[%d] START: FUN STRING test!\n", tid); assert(f[1] = fs_new(d1, 20, 0)); assert(f[2] = fs_new(d1, 20, 0)); assert(f[3] = fs_new(d2, 11, 0)); assert(!fs_cmp(f[1], f[2])); assert(fs_cmp(f[1], f[3])); assert(f[4] = fs_resize(f[1], 10)); assert(f[5] = fs_resize(f[2], 15)); assert(f[6] = fs_resize(f[3], 10)); assert(fs_cmp(f[4], f[5])); assert(!fs_ncmp(f[4], f[5], 10)); assert(!fs_ncmp(f[3], f[6], 10)); assert(f[7] = fs_access(f[1], 3, 10)); assert(f[8] = fs_access(f[4], 3, 5)); assert(f[9] = fs_access(f[5], 5, 10)); assert(!fs_ncmp(f[7], f[8], 3)); assert(fs_cmp(f[7], f[8])); assert(fs_ncmp(f[7], f[9], 5)); assert(10 == fs_len(f[7])); assert(5 == fs_len(f[8])); assert(10 == fs_len(f[7])); assert(20 == fs_len(f[1])); assert(10 == fs_len(f[4])); assert(11 == fs_len(f[3])); assert(f[10] = fs_set(f[1], '9', 40)); assert(f[11] = fs_set(f[1], '9', 50)); assert(f[12] = fs_set(f[1], 'A', 40)); assert(!fs_ncmp(f[10], f[11], 30)); assert(fs_cmp(f[10], f[11])); assert(fs_cmp(f[10], f[12])); assert(fs_cmp(f[1], f[10])); assert(f[13] = fs_dup(f[1])); assert(f[14] = fs_dup(f[2])); assert(f[15] = fs_dup(f[4])); assert(!fs_cmp(f[13], f[14])); assert(!fs_ncmp(f[13], f[15], 5)); assert(fs_cmp(f[13], f[6])); assert(f[16] = fs_chr(f[1], 'g')); assert(f[17] = fs_chr(f[4], 'g')); assert(f[18] = fs_rchr(f[1], 'g')); assert(!fs_ncmp(f[16], f[17], 3)); assert(!fs_cmp(f[16], f[18])); assert(fs_cmp(f[16], f[7])); assert(f[19] = fs_cat(f[3], f[16])); assert(f[20] = fs_cat(f[3], f[18])); assert(f[21] = fs_ncat(f[3], f[17], 2)); assert(!fs_cmp(f[19], f[20])); assert(fs_cmp(f[19], f[21])); assert(!fs_ncmp(f[19], f[21], 13)); // To test // cat // ncat fs_free(&f[1]); fs_free(&f[2]); fs_free(&f[3]); fs_free(&f[4]); fs_free(&f[5]); fs_free(&f[6]); fs_free(&f[7]); fs_free(&f[8]); fs_free(&f[9]); fs_free(&f[10]); fs_free(&f[11]); fs_free(&f[12]); fs_free(&f[13]); fs_free(&f[14]); fs_free(&f[15]); fs_free(&f[16]); fs_free(&f[17]); fs_free(&f[18]); fs_free(&f[19]); fs_free(&f[20]); fs_free(&f[21]); printf("[%d] Strings destroyed!\n", tid); printf("[%d] END: FUN STRING Test!\n\n", tid); return; }