1: 2007-01-26 (金) 23:11:07 |
2: 2007-01-26 (金) 23:41:45 |
| *16日目 [#kacbf79b] | | *16日目 [#kacbf79b] |
| + | -複数のタスクへの対応。 |
| + | |
| + | TASK構造体。個々のタスクと考えてよい。 |
| + | |
| + | TASKCTL構造体。この構造体の中に全てのタスクが納まっている。そして現在稼動中のタスクや総数を記憶。つまり、このシステム全体のタスクを管理しているただ一つの構造体。 |
| + | |
| + | task_init関数。タスクを一つ初期化し、稼動できる状態にする。内訳は |
| + | |
| + | struct TASK *task_init(struct MEMMAN *memman) |
| + | { |
| + | int i; |
| + | struct TASK *task; /* タスクを一つ準備する。 |
| + | /*----------------------------------------------------------------------------*/ |
| + | /* これまででは、 |
| + | struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT; |
| + | set_segmdesc(gdt + 何番目?, 103, (int) どのtss構造体?, AR_TSS32); |
| + | ・・・と、こういう指定でtssをGDTにセットしていた。 */ |
| + | /*----------------------------------------------------------------------------*/ |
| + | |
| + | /* ここはまあ、前と同じだが・・・・ */ |
| + | struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT; |
| + | /*これ以降が違う。GDTの何番目にセットするのか。セットするtss構造体はどれなのか? |
| + | という情報を、以下のプログラムで自動的に探し出してセットしている*/ |
| + | |
| + | /* ちなみにtaskctl構造体がデカイのでメモリをゲットしているところ。 |
| + | taskctl = (struct TASKCTL *) memman_alloc_4k(memman, sizeof (struct TASKCTL)); |
| + | |
| + | /* ここにあるforで0〜最大タスク個数まで繰り返す。空いている番号が見つかったら |
| + | そこを新しいタスクとする。これにより、GDTの何番目を使うのか、tssがどの |
| + | タスク内のものなのかがわかる*/ |
| + | |
| + | 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; |
| + | } |