Ejemplo n.º 1
0
/*=======================================================
                 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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
//--------------------------------------------------------------------------
//  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;
    }

}
Ejemplo n.º 5
0
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;
    }
}
Ejemplo n.º 6
0
/*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;
}
Ejemplo n.º 7
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;
}