/*======================================================= init_prot() ========================================================*/ PUBLIC void init_prot() { init_8259A(); //初始化异常 (中断门 没有陷阱门) init_idt_desc( INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_USER); init_idt_desc( INT_VECTOR_OVERFLOW, DA_386IGate , overflow, PRIVILEGE_USER); init_idt_desc( INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_INVAL_OP, DA_386IGate, inval_opcode, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_INVAL_TSS, DA_386IGate, inval_tss, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); /*初始化中断*/ init_idt_desc(INT_VECTOR_IRQ0 + 0, DA_386IGate , hint00 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 1, DA_386IGate , hint01 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 2, DA_386IGate , hint02 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 3, DA_386IGate , hint03 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 4, DA_386IGate , hint04 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 5, DA_386IGate , hint05 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 6, DA_386IGate , hint06 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 7, DA_386IGate , hint07 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 0, DA_386IGate , hint08 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 1, DA_386IGate , hint09 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 2, DA_386IGate , hint10 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 3, DA_386IGate , hint11 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 4, DA_386IGate , hint12 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 5, DA_386IGate , hint13 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 6, DA_386IGate , hint14 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 7, DA_386IGate , hint15 , PRIVILEGE_KRNL); /* 填充 GDT 中的 TSS */ memset(&tss,0,sizeof(tss)); tss.ss0 = SELECTOR_KERNEL_DS; init_descriptor(&gdt[INDEX_TSS], vir2phys(seg2phys(SELECTOR_KERNEL_DS),&tss), sizeof(tss) - 1, DA_386TSS); tss.iobase = sizeof(tss); /*没有I/O许可位图*/ /*填充 GDT 中进程的 LDT的描述符 */ init_descriptor(&gdt[INDEX_LDT_FIRST], vir2phys(seg2phys(SELECTOR_KERNEL_DS),proc_table[0].ldts), LDT_SIZE * sizeof(DESCRIPTOR) - 1, DA_LDT); }
PUBLIC int arch_set_params(char *params, int size) { if(size > params_size) return E2BIG; phys_copy(vir2phys(params), seg2phys(mon_ds) + params_offset, size); return OK; }
PUBLIC int arch_get_params(char *params, int maxsize) { phys_copy(seg2phys(mon_ds) + params_offset, vir2phys(params), MIN(maxsize, params_size)); params[maxsize-1] = '\0'; return OK; }
//-------------------------------------------------------------------------- // init_prot //-------------------------------------------------------------------------- void init_prot() { init_8259A(); // 全部初始化成中断门(没有陷阱门) init_idt_desc(INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_OVERFLOW, DA_386IGate, overflow, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_OP, DA_386IGate, inval_opcode, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_TSS, DA_386IGate, inval_tss, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 0, DA_386IGate, hwint00, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 1, DA_386IGate, hwint01, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 2, DA_386IGate, hwint02, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 3, DA_386IGate, hwint03, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 4, DA_386IGate, hwint04, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 5, DA_386IGate, hwint05, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 6, DA_386IGate, hwint06, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 7, DA_386IGate, hwint07, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 0, DA_386IGate, hwint08, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 1, DA_386IGate, hwint09, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 2, DA_386IGate, hwint10, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 3, DA_386IGate, hwint11, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 4, DA_386IGate, hwint12, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 5, DA_386IGate, hwint13, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 6, DA_386IGate, hwint14, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 7, DA_386IGate, hwint15, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_SYS_CALL, DA_386IGate, sys_call, PRIVILEGE_USER); //填充 GDT 中 TSS 这个描述符 memset(&tss, 0, sizeof(tss)); tss.ss0 = SELECTOR_KERNEL_DS; init_descriptor(&gdt[INDEX_TSS], vir2phys(seg2phys(SELECTOR_KERNEL_DS), &tss), sizeof(tss) - 1, DA_386TSS); tss.iobase = sizeof(tss); // 没有I/O许可位图 // 填充 GDT 中进程的 LDT 的描述符 int i; PROCESS* p_proc = proc_table; u16 selector_ldt = INDEX_LDT_FIRST << 3; for(i=0;i<NR_TASKS;i++){ init_descriptor(&gdt[selector_ldt>>3], vir2phys(seg2phys(SELECTOR_KERNEL_DS), proc_table[i].ldts), LDT_SIZE * sizeof(DESCRIPTOR) - 1, DA_LDT); p_proc++; selector_ldt += 1 << 3; } }
void init_trap() { int i; init_8259A(); //soft interrupt set_trap_gate(INT_VECTOR_DIVIDE,divide_error); set_trap_gate(INT_VECTOR_DEBUG, single_step_exception); set_trap_gate(INT_VECTOR_NMI, nmi); set_system_gate(INT_VECTOR_BREAKPOINT, breakpoint_exception); set_system_gate(INT_VECTOR_OVERFLOW, overflow); set_system_gate(INT_VECTOR_BOUNDS, bounds_check); set_trap_gate(INT_VECTOR_INVAL_OP, inval_opcode); set_trap_gate(INT_VECTOR_COPROC_NOT, copr_not_available); set_trap_gate(INT_VECTOR_DOUBLE_FAULT, double_fault); set_trap_gate(INT_VECTOR_COPROC_SEG, copr_seg_overrun); set_trap_gate(INT_VECTOR_INVAL_TSS, inval_tss); set_trap_gate(INT_VECTOR_SEG_NOT, segment_not_present); set_trap_gate(INT_VECTOR_STACK_FAULT, stack_exception); set_trap_gate(INT_VECTOR_PROTECTION, general_protection); set_trap_gate(INT_VECTOR_PAGE_FAULT, page_fault); set_trap_gate(INT_VECTOR_COPROC_ERR, copr_error); // hard interrupt IRQ0-IRQ15 set_intr_gate(INT_VECTOR_IRQ0 + 0, clock_intr); //clock interrupt set_intr_gate(INT_VECTOR_IRQ0 + 1, kb_intr); //keyboard interrupt set_intr_gate(INT_VECTOR_IRQ0 + 2, hwint02); set_intr_gate(INT_VECTOR_IRQ0 + 3, hwint03); set_intr_gate(INT_VECTOR_IRQ0 + 4, hwint04); set_intr_gate(INT_VECTOR_IRQ0 + 5, hwint05); set_intr_gate(INT_VECTOR_IRQ0 + 6, hwint06); set_intr_gate(INT_VECTOR_IRQ0 + 7, hwint07); set_intr_gate(INT_VECTOR_IRQ8 + 0, hwint08); set_intr_gate(INT_VECTOR_IRQ8 + 1, hwint09); set_intr_gate(INT_VECTOR_IRQ8 + 2, hwint10); set_intr_gate(INT_VECTOR_IRQ8 + 3, hwint11); set_intr_gate(INT_VECTOR_IRQ8 + 4, hwint12); set_intr_gate(INT_VECTOR_IRQ8 + 5, hwint13); set_intr_gate(INT_VECTOR_IRQ8 + 6, hd_intr);//hard disk interrupt set_intr_gate(INT_VECTOR_IRQ8 + 7, hwint15); //init 80 interrupt set_syscall_gate(INT_VECTOR_SYS_CALL, sys_call); memset((char *)&tss, 0, sizeof(tss)); tss.ss0 = SELECTOR_KERNEL_DS; //¿¿TSS init_descriptor(&gdt[INDEX_TSS], vir2phys(seg2phys(SELECTOR_KERNEL_DS), &tss), sizeof(tss) - 1, DA_386TSS); tss.iobase = sizeof(tss); PROCESS* p_proc = proc_table; t16 selector_ldt = INDEX_LDT_FIRST << 3; //¿¿GDT¿¿¿¿¿¿¿LDT for(i=0;i<NR_SYSTEM_PROCS + NR_USER_PROCS;i++) { init_descriptor(&gdt[selector_ldt>>3], vir2phys(seg2phys(SELECTOR_KERNEL_DS), proc_table[i].ldts), LDT_SIZE * sizeof(DESCRIPTOR) - 1, DA_LDT); p_proc++; selector_ldt += 1 << 3; } }
/*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; }