From 575c4ffce8fe1269ce7847552563516604ff56be Mon Sep 17 00:00:00 2001 From: Yourtion Date: Tue, 17 May 2016 12:39:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E6=8A=A4=E5=BA=94=E7=94=A8=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=EF=BC=882=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 27_day/bootpack.h | 12 +++++++----- 27_day/console.c | 6 +++--- 27_day/mtask.c | 3 ++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/27_day/bootpack.h b/27_day/bootpack.h index 2195e24..f4ec328 100644 --- a/27_day/bootpack.h +++ b/27_day/bootpack.h @@ -88,15 +88,16 @@ struct GATE_DESCRIPTOR { void init_gdtidt(void); void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar); void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar); -#define ADR_IDT 0x0026f800 -#define LIMIT_IDT 0x000007ff -#define ADR_GDT 0x00270000 -#define LIMIT_GDT 0x0000ffff +#define ADR_IDT 0x0026f800 +#define LIMIT_IDT 0x000007ff +#define ADR_GDT 0x00270000 +#define LIMIT_GDT 0x0000ffff #define ADR_BOTPAK 0x00280000 #define LIMIT_BOTPAK 0x0007ffff #define AR_DATA32_RW 0x4092 #define AR_CODE32_ER 0x409a -#define AR_TSS32 0x0089 +#define AR_LDT 0x0082 +#define AR_TSS32 0x0089 #define AR_INTGATE32 0x008e /* int.c */ @@ -210,6 +211,7 @@ struct TASK { int level, priority; /* 优先级 */ struct FIFO32 fifo; struct TSS32 tss; + struct SEGMENT_DESCRIPTOR ldt[2]; struct CONSOLE *cons; int ds_base, cons_stack; }; diff --git a/27_day/console.c b/27_day/console.c index 536aa8f..6ce8fdc 100644 --- a/27_day/console.c +++ b/27_day/console.c @@ -373,12 +373,12 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline) dathrb = *((int *) (p + 0x0014)); q = (char *) memman_alloc_4k(memman, segsiz); task->ds_base = (int) q; - set_segmdesc(gdt + task->sel / 8 + 1000, finfo->size - 1, (int) p, AR_CODE32_ER + 0x60); - set_segmdesc(gdt + task->sel / 8 + 2000, segsiz - 1, (int) q, AR_DATA32_RW + 0x60); + set_segmdesc(task->ldt + 0, finfo->size - 1, (int) p, AR_CODE32_ER + 0x60); + set_segmdesc(task->ldt + 1, segsiz - 1, (int) q, AR_DATA32_RW + 0x60); for (i = 0; i < datsiz; i++) { q[esp + i] = p[dathrb + i]; } - start_app(0x1b, task->sel + 1000 * 8, esp, task->sel + 2000 * 8, &(task->tss.esp0)); + start_app(0x1b, 0 * 8 + 4, esp, 1 * 8 + 4, &(task->tss.esp0)); shtctl = (struct SHTCTL *) *((int *) 0x0fe4); for (i = 0; i < MAX_SHEETS; i++) { sht = &(shtctl->sheets0[i]); diff --git a/27_day/mtask.c b/27_day/mtask.c index b91869d..f67b935 100644 --- a/27_day/mtask.c +++ b/27_day/mtask.c @@ -82,7 +82,9 @@ struct TASK *task_init(struct MEMMAN *memman) for (i = 0; i < MAX_TASKS; i++) { taskctl->tasks0[i].flags = 0; taskctl->tasks0[i].sel = (TASK_GDT0 + i) * 8; + taskctl->tasks0[i].tss.ldtr = (TASK_GDT0 + MAX_TASKS + i) * 8; set_segmdesc(gdt + TASK_GDT0 + i, 103, (int) &taskctl->tasks0[i].tss, AR_TSS32); + set_segmdesc(gdt + TASK_GDT0 + MAX_TASKS + i, 15, (int) taskctl->tasks0[i].ldt, AR_LDT); } for (i = 0; i < MAX_TASKLEVELS; i++) { taskctl->level[i].running = 0; @@ -133,7 +135,6 @@ struct TASK *task_alloc(void) task->tss.ds = 0; task->tss.fs = 0; task->tss.gs = 0; - task->tss.ldtr = 0; task->tss.iomap = 0x40000000; task->tss.ss0 = 0; return task;