📄 schedule.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 + -