Beispiel #1
0
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);
}
Beispiel #2
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;
}