diff --git a/16_day/bootpack.c b/16_day/bootpack.c index 85eb835..22dc57f 100644 --- a/16_day/bootpack.c +++ b/16_day/bootpack.c @@ -7,13 +7,6 @@ void make_window8(unsigned char *buf, int xsize, int ysize, char *title); void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b, char *s, int l); void make_textbox8(struct SHEET *sht, int x0, int y0, int sx, int sy, int c); -struct TSS32 { - int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; - int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi; - int es, cs, ss, ds, fs, gs; - int ldtr, iomap; -}; - void task_b_main(struct SHEET *sht_back); void HariMain(void) @@ -23,7 +16,7 @@ void HariMain(void) char s[40]; int fifobuf[128]; struct TIMER *timer, *timer2, *timer3; - int mx, my, i, cursor_x, cursor_c, task_b_esp; + int mx, my, i, cursor_x, cursor_c; unsigned int memtotal; struct MOUSE_DEC mdec; struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; @@ -38,8 +31,7 @@ void HariMain(void) 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.' }; - struct TSS32 tss_a, tss_b; - struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT; + struct TASK *task_b; init_gdtidt(); init_pic(); @@ -96,32 +88,18 @@ void HariMain(void) memtotal / (1024 * 1024), memman_total(memman) / 1024); putfonts8_asc_sht(sht_back, 0, 32, COL8_FFFFFF, COL8_008484, s, 40); - tss_a.ldtr = 0; - tss_a.iomap = 0x40000000; - tss_b.ldtr = 0; - tss_b.iomap = 0x40000000; - set_segmdesc(gdt + 3, 103, (int) &tss_a, AR_TSS32); - set_segmdesc(gdt + 4, 103, (int) &tss_b, AR_TSS32); - load_tr(3 * 8); - task_b_esp = memman_alloc_4k(memman, 64 * 1024) + 64 * 1024 - 8; - tss_b.eip = (int) &task_b_main; - tss_b.eflags = 0x00000202; /* IF = 1; */ - tss_b.eax = 0; - tss_b.ecx = 0; - tss_b.edx = 0; - tss_b.ebx = 0; - tss_b.esp = task_b_esp; - tss_b.ebp = 0; - tss_b.esi = 0; - tss_b.edi = 0; - tss_b.es = 1 * 8; - tss_b.cs = 2 * 8; - tss_b.ss = 1 * 8; - tss_b.ds = 1 * 8; - tss_b.fs = 1 * 8; - tss_b.gs = 1 * 8; - *((int *) (task_b_esp + 4)) = (int) sht_back; - mt_init(); + task_init(memman); + task_b = task_alloc(); + task_b->tss.esp = memman_alloc_4k(memman, 64 * 1024) + 64 * 1024 - 8; + task_b->tss.eip = (int) &task_b_main; + task_b->tss.es = 1 * 8; + task_b->tss.cs = 2 * 8; + task_b->tss.ss = 1 * 8; + task_b->tss.ds = 1 * 8; + task_b->tss.fs = 1 * 8; + task_b->tss.gs = 1 * 8; + *((int *) (task_b->tss.esp + 4)) = (int) sht_back; + task_run(task_b); for (;;) { io_cli(); diff --git a/16_day/bootpack.h b/16_day/bootpack.h index 53e8840..5622ba7 100644 --- a/16_day/bootpack.h +++ b/16_day/bootpack.h @@ -185,6 +185,26 @@ void timer_settime(struct TIMER *timer, unsigned int timeout); void inthandler20(int *esp); /* mtask.c */ -extern struct TIMER *mt_timer; -void mt_init(void); -void mt_taskswitch(void); +#define MAX_TASKS 1000 /*最大任务数量*/ +#define TASK_GDT0 3 /*定义从GDT的几号开始分配给TSS */ +struct TSS32 { + int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; + int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi; + int es, cs, ss, ds, fs, gs; + int ldtr, iomap; +}; +struct TASK { + int sel, flags; /* sel用来存放GDT的编号*/ + struct TSS32 tss; +}; +struct TASKCTL { + int running; /*正在运行的任务数量*/ + int now; /*这个变量用来记录当前正在运行的是哪个任务*/ + struct TASK *tasks[MAX_TASKS]; + struct TASK tasks0[MAX_TASKS]; +}; +extern struct TIMER *task_timer; +struct TASK *task_init(struct MEMMAN *memman); +struct TASK *task_alloc(void); +void task_run(struct TASK *task); +void task_switch(void); diff --git a/16_day/mtask.c b/16_day/mtask.c index ccc5227..a382f22 100644 --- a/16_day/mtask.c +++ b/16_day/mtask.c @@ -2,26 +2,78 @@ #include "bootpack.h" -struct TIMER *mt_timer; -int mt_tr; +struct TASKCTL *taskctl; +struct TIMER *task_timer; -void mt_init(void) +struct TASK *task_init(struct MEMMAN *memman) { - mt_timer = timer_alloc(); - /*这里没有必要使用timer_init */ - timer_settime(mt_timer, 2); - mt_tr = 3 * 8; + 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 = timer_alloc(); + timer_settime(task_timer, 2); + return task; +} + +struct TASK *task_alloc(void) +{ + int i; + struct TASK *task; + for (i = 0; i < MAX_TASKS; i++) { + if (taskctl->tasks0[i].flags == 0) { + task = &taskctl->tasks0[i]; + task->flags = 1; /*正在使用的标志*/ + task->tss.eflags = 0x00000202; /* IF = 1; */ + task->tss.eax = 0; /*这里先置为0*/ + task->tss.ecx = 0; + task->tss.edx = 0; + task->tss.ebx = 0; + task->tss.ebp = 0; + task->tss.esi = 0; + task->tss.edi = 0; + task->tss.es = 0; + task->tss.ds = 0; + task->tss.fs = 0; + task->tss.gs = 0; + task->tss.ldtr = 0; + task->tss.iomap = 0x40000000; + return task; + } + } + return 0; /*全部正在使用*/ +} + +void task_run(struct TASK *task) +{ + task->flags = 2; /*活动中标志*/ + taskctl->tasks[taskctl->running] = task; + taskctl->running++; return; } -void mt_taskswitch(void) +void task_switch(void) { - if (mt_tr == 3 * 8) { - mt_tr = 4 * 8; - } else { - mt_tr = 3 * 8; + timer_settime(task_timer, 2); + if (taskctl->running >= 2) { + taskctl->now++; + if (taskctl->now == taskctl->running) { + taskctl->now = 0; + } + farjmp(0, taskctl->tasks[taskctl->now]->sel); } - timer_settime(mt_timer, 2); - farjmp(0, mt_tr); return; -} \ No newline at end of file +} diff --git a/16_day/timer.c b/16_day/timer.c index 85634b0..f2138aa 100644 --- a/16_day/timer.c +++ b/16_day/timer.c @@ -102,7 +102,7 @@ void inthandler20(int *esp) } /* 超时 */ timer->flags = TIMER_FLAGS_ALLOC; - if (timer != mt_timer) { + if (timer != task_timer) { fifo32_put(timer->fifo, timer->data); } else { ts = 1; /* mt_timer超时*/ @@ -112,7 +112,7 @@ void inthandler20(int *esp) timerctl.t0 = timer; timerctl.next = timer->timeout; if (ts != 0) { - mt_taskswitch(); + task_switch(); } return; } \ No newline at end of file