/** * Do some initialization work. * *****************************************************************************/ PRIVATE void init_mm() { struct boot_params bp; get_boot_params(&bp); memory_size = bp.mem_size; kernel_addr = bp.kernel_file; printl("Memory:%dMB\n", memory_size / 1024 /1024); unsigned int k_base; unsigned int k_limit; int ret = get_kernel_map(&k_base, &k_limit); if (ret == 0) printl("Kernel memory: 0x%x - 0x%x(%dkB)\n", k_base, k_base + k_limit, k_limit/1024); /* int page_tbl_size = memory_size / 1024; buffer_base = (int)PAGE_TBL_BASE + page_tbl_size + (1024 * 1024); buffer_length = (2 * 1024 * 1024); init_buffer(); rd_base = buffer_base + buffer_length + (256 * 1024); rd_length = 2 * 1024 * 1024; mem_start = rd_base + rd_length + (256 * 1024); */ buffer_base = (unsigned char *)BUFFER_BASE; buffer_length = BUFFER_LENGTH; //init_buffer(); #ifdef RAMDISK rd_base = (unsigned char *)RAMDISK_BASE; rd_length = RAMDISK_LENGTH; #endif mem_start = PROCS_BASE; free_mem_size = memory_size - mem_start; printl("Free memory:%dMB\n", free_mem_size / 1024 / 1024); paging_pages = memory_size / PAGE_SIZE; printl("%d pages\n", paging_pages); }
strcpy(p->name, t->name); /* name of the process */ p->p_parent = NO_TASK; if (strcmp(t->name, "INIT") != 0) { p->ldts[INDEX_LDT_C] = gdt[SELECTOR_KERNEL_CS >> 3]; p->ldts[INDEX_LDT_RW] = gdt[SELECTOR_KERNEL_DS >> 3]; /* change the DPLs */ p->ldts[INDEX_LDT_C].attr1 = DA_C | priv << 5; p->ldts[INDEX_LDT_RW].attr1 = DA_DRW | priv << 5; } else { /* INIT process */ unsigned int k_base; unsigned int k_limit; int ret = get_kernel_map(&k_base, &k_limit); assert(ret == 0); init_desc(&p->ldts[INDEX_LDT_C], 0, /* bytes before the entry point * are useless (wasted) for the * INIT process, doesn't matter */ (k_base + k_limit) >> LIMIT_4K_SHIFT, DA_32 | DA_LIMIT_4K | DA_C | priv << 5); init_desc(&p->ldts[INDEX_LDT_RW], 0, /* bytes before the entry point * are useless (wasted) for the * INIT process, doesn't matter */ (k_base + k_limit) >> LIMIT_4K_SHIFT,
/*init the first process*/ static void init_kernel_thread() { TASK* p_task = NULL; /*struct task_struct* p_proc = proc_table;*/ struct task_struct *tsk = NULL; union thread_union *thread_union = NULL; char* p_task_stack = task_stack + STACK_SIZE_TOTAL; int i,j,prio,eflags; char privilege,rpl; unsigned int k_base,k_limit; get_kernel_map(&k_base,&k_limit); privilege = PRIVILEGE_TASK; rpl = RPL_TASK; eflags = 0x1202; prio = KERNEL_PRIOR; printk(" PrettyOS SoftIRQ."); /*printk(" [email protected] .\n");*/ /*printk(" UESTC.\n");*/ /*disp_str("\t\tprocess init begins\n");*/ /*for(i = 0;i < NR_SYSTEM_PROCS ;++i, ++p_proc)*/ for(i = 0;i < NR_SYSTEM_PROCS ;++i) { p_task = task_table + i; tsk = (struct task_struct *)kmem_get_obj(tsk_cachep); if(tsk == NULL) return; thread_union = (union thread_union*)kmem_get_obj(thread_union_cachep); if(thread_union == NULL) return; thread_union->thread_info.task = tsk; tsk->state = TASK_RUNNING; strcpy(tsk->command, p_task->command); // name of the process if((tsk->pid = get_pidmap()) < 0) return; tsk->parent = NULL; tsk->next = tsk->sibling = NULL; /*proc_table[0].nr_tty = 0; // tty */ for(j = 0; j < NR_SIGNALS;++j) { tsk->sig_action[j].sa_flags = 0; tsk->sig_action[j].sa_handler = do_signal; } for(j = 0;j < NR_OPEN; ++j) { tsk->filp[j] = NULL; } tsk->signal = 0x0; //设置信号为空 tsk->ldt_sel = selector_ldt; init_descriptor(&gdt[selector_ldt>>3],vir2phys(seg2phys(SELECTOR_KERNEL_DS), tsk->ldts),LDT_SIZE * sizeof(DESCRIPTOR) - 1,DA_LDT); init_descriptor(&tsk->ldts[INDEX_LDT_C],0,(k_base + k_limit) >> LIMIT_4K_SHIFT,DA_32 | DA_LIMIT_4K | DA_C| privilege <<5); init_descriptor(&tsk->ldts[INDEX_LDT_D],0,(k_base + k_limit) >> LIMIT_4K_SHIFT,DA_32 | DA_LIMIT_4K | DA_DRW | privilege << 5); tsk->regs.esp = (unsigned int)p_task_stack; p_task_stack -= STACK_SIZE_DEFAULT; tsk->regs.cs = (unsigned int)(((8 * 0) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.ds = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.es = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.fs = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.ss = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.gs = (unsigned int)((SELECTOR_KERNEL_GS & SA_RPL_MASK) | rpl); tsk->regs.eip = (unsigned int)p_task->initial_eip; tsk->regs.eflags = eflags; tsk->ticks = tsk->priority = prio; tsk->sched_entity.vruntime = i; tsk->sched_class = &rr_sched; if(tsk->pid != INIT_PID) tsk->sched_class->enqueue_task(&(sched_rq),tsk,0,0); p_task++; selector_ldt += 1 << 3; } k_reenter = 0; ticks = 0; }
/*init the first process*/ static void init_user_process() { TASK* p_task = NULL; /*struct task_struct* p_proc = proc_table + NR_SYSTEM_PROCS;*/ struct task_struct *tsk = NULL; union thread_union *thread_union = NULL; int i,j,prio, eflags; char privilege,rpl; unsigned int k_base,k_limit; get_kernel_map(&k_base,&k_limit); /*privilege = PRIVILEGE_USER;*/ /*rpl = RPL_USER;*/ /*eflags = 0x1202;*/ /*prio = USER_PRIO;*/ privilege = PRIVILEGE_TASK; rpl = RPL_TASK; eflags = 0x1202; prio = KERNEL_PRIOR; /*for(i = 0;i < NR_USER_PROCS; ++i,++p_proc)*/ for(i = 0;i < NR_USER_PROCS; ++i) { p_task = user_proc_table + i ; tsk = (struct task_struct *)kmem_get_obj(tsk_cachep); if(tsk == NULL) return; thread_union = (union thread_union*)kmem_get_obj(thread_union_cachep); if(thread_union == NULL) return; thread_union->thread_info.task = tsk; tsk->state = TASK_RUNNING; strcpy(tsk->command, p_task->command); // name of the process if((tsk->pid = get_pidmap()) < 0) return; tsk->parent = NULL; tsk->next = tsk->sibling = NULL; for(j = 0; j < NR_SIGNALS;++j) { tsk->sig_action[j].sa_flags = 0; tsk->sig_action[j].sa_handler = do_signal; } for(j = 0;j < NR_OPEN; ++j) { tsk->filp[j] = NULL; } tsk->signal = 0x0; //设置信号为空 tsk->ldt_sel = selector_ldt; init_descriptor(&gdt[selector_ldt>>3],vir2phys(seg2phys(SELECTOR_KERNEL_DS), tsk->ldts),LDT_SIZE * sizeof(DESCRIPTOR) - 1,DA_LDT); tsk->ldts[INDEX_LDT_C] = gdt[SELECTOR_KERNEL_CS >> 3]; tsk->ldts[INDEX_LDT_C].attr1 = DA_C | privilege << 5;// change the DPL tsk->ldts[INDEX_LDT_D] = gdt[SELECTOR_KERNEL_DS >> 3]; tsk->ldts[INDEX_LDT_D].attr1 = DA_DRW | privilege<< 5;// change the DPL /*init_descriptor(&tsk->ldts[INDEX_LDT_C],0,(k_base + k_limit) >> LIMIT_4K_SHIFT,DA_32 | DA_LIMIT_4K | DA_C| privilege <<5);*/ /*init_descriptor(&tsk->ldts[INDEX_LDT_D],0,(k_base + k_limit) >> LIMIT_4K_SHIFT,DA_32 | DA_LIMIT_4K | DA_DRW | privilege << 5);*/ char *stack = (char *)thread_union->stack; tsk->regs.esp = (unsigned int)(stack + sizeof(union thread_union)); tsk->regs.cs = (unsigned int)(((8 * 0) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.ds = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.es = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.fs = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.ss = (unsigned int)(((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl); tsk->regs.gs = (unsigned int)((SELECTOR_KERNEL_GS & SA_RPL_MASK) | rpl); tsk->regs.eip = (unsigned int)p_task->initial_eip; tsk->regs.eflags = eflags; tsk->ticks = tsk->priority = prio; tsk->sched_entity.vruntime = i; tsk->sched_class = &rr_sched; tsk->sched_class->enqueue_task(&(sched_rq),tsk,0,0); p_task++; selector_ldt += 1 << 3; } k_reenter = 0; ticks = 0; }