一、任务管理自动化
为了提高复用性(新增任务数量,不用修改task_switch),也不用考虑GDT的情况,所以做了代码的优化。
1、task_init
在此函数内主要执行了以下几个动作:
①为taskctl分配内存空间
② 自动初始化所有GDT
③创建了一个task,并开始运行,由于taskctl->running等于1,所以并不会任务切换。只有一个任务在正常运行。
struct TASK *task_init(struct MEMMAN *memman)
{
int i;
struct TASK *task;
struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
taskctl = (struct TASKCTL *) memman_alloc_4k(memman, sizeof (struct TASKCTL));
for (i = 0; i < MAX_TASKS; i++) {
taskctl->tasks0[i].flags = 0;
taskctl->tasks0[i].sel = (TASK_GDT0 + i) * 8;
set_segmdesc(gdt + TASK_GDT0 + i, 103, (int) &taskctl->tasks0[i].tss, AR_TSS32);
}
task = task_alloc();
task->flags = 2; /* 動作中マーク */
taskctl->running = 1;
taskctl->now = 0;
taskctl->tasks[0] = task;
load_tr(task->sel);
task_timer