void KernelInit(void) { KerStatInit(); /* 커널 상태 초기화 */ PCBListInit(); /* PCB 리스트 초기화 */ ECBListInit(); /* ECB 리스트 초기화 */ //ThreadInit(); /* 리눅스 커널을 이용한 쓰레드 초기화 [리눅스 포트 사용시 활성화] */ procCreate(proc_background, &background_stack[STACK_SIZE - 1], PROC_CNT - 1); /* 백그라운드 프로세스 생성 */ }
void procSetup(){ int i, j; //Reset de la tabla de process for(i = 1 ; i < MAX_PROCESS ; i++){ proc[i].pid = i - MAX_PROCESS; //Para que el pid pueda referenciarse con %MAX_PROCESS proc[i].status = FREE; for(j = 0 ; j < MAX_OPENFILES ; j++) proc[i].fds[j] = -1; } //Reset de la tabla de contextos for(i = 0 ; i < MAX_PROCESS_CONTEXTS ; i++){ contexs[i].inUse = 0; } strcpy(proc[INIT_PROCESS].name, "init"); proc[INIT_PROCESS].semChild = semGetID(0); proc[INIT_PROCESS].pid = INIT_PROCESS; proc[INIT_PROCESS].ppid = INIT_PROCESS; proc[INIT_PROCESS].status = RUNNING; proc[INIT_PROCESS].attachedTTY = 0; proc[INIT_PROCESS].fds[STDIN] = IN_0; proc[INIT_PROCESS].fds[STDOUT] = TTY_0; proc[INIT_PROCESS].fds[CURSOR] = TTY_CURSOR_0; proc[INIT_PROCESS].childCount = 0; int fds[3]; fds[STDIN] = IN_0; fds[STDOUT] = TTY_0; fds[CURSOR] = TTY_CURSOR_0; schedSetUpInit(INIT_PROCESS, "init", 0); schedStart(); schedSetUpIdle(procCreate("idle", (process_t)idle, (void *)getPage(), NULL, fds, 3, 0, NULL, 0, 0, 3)); return; }
/* * ======== daemon ======== */ static Int daemon(Void) { GT_0trace(curTrace, GT_1CLASS, "daemon> thread created.\n"); for (;;) { Processor_Handle proc; switch (getCmd(&proc)) { case CREATE: { putReply(procCreate(proc) ? SUCCESS : FAILURE); break; } case DELETE: { /* GT_1trace(curTrace, GT_ENTER, "daemon(0x%x) deleting ...\n", * proc); */ procDelete(proc); /* GT_1trace(curTrace, GT_ENTER, "daemon(0x%x) replying ...\n", * proc); */ putReply(SUCCESS); break; } case EXIT: { //GT_0trace(curTrace, GT_1CLASS, "daemon> thread terminating\n"); putReply(SUCCESS); return (0); } default: { break; } } } }
/* * ======== daemon ======== */ static Int daemon(Void) { Log_print0(Diags_USER1, "[+1] daemon> thread created."); for (;;) { Processor_Handle proc; switch (getCmd(&proc)) { case CREATE: { putReply(procCreate(proc) ? SUCCESS : FAILURE); break; } case DELETE: { /* Log_print1(Diags_USER1, "daemon(0x%x) deleting ...", * (IArg)proc); */ procDelete(proc); /* Log_print1(Diags_USER1, "daemon(0x%x) replying ...", * (IArg)proc); */ putReply(SUCCESS); break; } case EXIT: { //Log_print0(Diags_USER1, "daemon> thread terminating"); putReply(SUCCESS); return (0); } default: { break; } } } }
/* * ======== Processor_create ======== */ Processor_Handle Processor_create(String imageName, String linkCfg, Processor_Attrs *attrs) { Processor_Handle proc = NULL; Log_print3(Diags_ENTRY, "[+E] Processor_create> " "Enter(imageName='%s', linkCfg='%s', attrs=0x%x)", (IArg)imageName, (IArg)linkCfg, (IArg)attrs); #if MESSAGEQ_ENABLED /* This implementation requires attrs->name to be provided */ if ((attrs == NULL) || (attrs->cpuId == NULL)) { Log_print0(Diags_USER7, "[+7] Processor_create> ERROR: invalid attrs"); return (NULL); } if ((proc = xdc_runtime_Memory_alloc(NULL, sizeof(Processor_Obj), 0, NULL)) == NULL) { Log_print0(Diags_USER7, "[+7] Processor_create> " "ERROR: Memory_alloc failed"); return (NULL); } proc->hHeap = NULL; proc->heapId = (UInt16)Processor_INVALID; if (!procCreate(proc, attrs->cpuId)) { Processor_delete(proc); return (NULL); } #endif Log_print1(Diags_EXIT, "[+X] Processor_create> return (0x%x)", (IArg)proc); return (proc); }
int contextCreate(processApi_t context){ int i, *fds = getFDs(schedCurrentProcess()); void *stack = (void*)getPage(); if(stack == NULL) return -1; /* Si no seteo fds los heredo de mi padre */ for( i = 0 ; i < MAX_OPENFILES ; i++){ if(context->fds[i] == -1){ context->fds[i] = fds[i]; } else if(context->fds[i] == -2) context->fds[i] = -1; } int ret = procCreate(context->name, context->process, stack, NULL, context->fds, MAX_OPENFILES, context->argc, context->argv, procAttachedTTY(schedCurrentProcess()), 0, context->priority); if(ret != -1) contextDestroy(context); return ret; }