⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 schedule.c

📁 别人的根据linux0.11改的一个小的操作系统
💻 C
字号:
/*
 * schedule.c
 *
 * Define some functions about task schedule
 */
#include <def.h>
#include <sched.h>
#include <stdio.h>

/*
 *	switch_to(n) should switch tasks to a new task.
 */
#define switch_to() \
{ \
    struct {long a,b;} __tmp; \
    asm( \
   	   "movl %%edx,%1\n\t" \
	   "ljmp *%0\n\t" \
	   ::"m" (*&__tmp.a),"m" (*&__tmp.b),"d"(p_current->tss_sel) \
    ); \
}

/*
 *This routine is used for initilize a new task,
 *1.Search for a new task_struct(task[x]);
 *2.Initilize ldt arrays and tss struct
 *3.Insert into task linkedlist.
 */
void task_init(void *task_start)
{
    int i;
    struct task_struct *v;
    process_id;

    i = 1;
    while((task[i].pid!=-1) && (i++<NR_TASK));

    if(i==NR_TASK)
    {
        print("Error task_init()...\n");
        return;     // Can not create any task
    }

    task[i].pid = process_id++;
    task[i].pname[0] = 'T';task[i].pname[1] = 0;
    task[i].priority = 3;
    task[i].ldt_sel = _LDT(i);
    task[i].tss_sel = _TSS(i);

    memcopy(&(task[i].ldt[0]), _ldt0, 0x20);
    memcopy(&(task[i].tss.back_link), _tss0, 0x68);

    task[i].tss.eip = (unsigned long)task_start;
    task[i].tss.ldt = _LDT(i);
    task[i].tss.esp0 = (unsigned long)&(task[i].stack_krn[115]);
    task[i].tss.esp = (unsigned long)&(task[i].stack_user[255]);

    set_ldt_desc(i, &(task[i].ldt[0]));
    set_tss_desc(i, &(task[i].tss.back_link));

    if(p_ready==NULL)
    {   
        p_head = p_ready = &task[i];
        p_ready->next = p_ready;
    }
    else
    {
        v = p_ready->next;
        p_ready->next = &task[i];
        p_ready->next->next = v;
    }
}

/*
 *It will be called by timer interrupt
 */
void do_timer()
{    //esp-=5*4
    if(p_ready==NULL)
    {
        return;
    }
    if(p_current!=NULL)
    {
        p_current->counter--;
    }
	schedule();
}
/*
 *Implement task schedule
 */
void schedule()
{   //esp-=6*4
    if(p_current!=NULL)
    {
        if(p_current->counter>=0)
        {
            return;
        }    
    }
    p_previous = p_current;
    p_current = p_ready;
    p_ready = p_ready->next;
    p_current->counter = 18;
    switch_to();           //p_current
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -