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