雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
1: 2007-01-26 (金) 23:11:07 ソース バックアップ No.1 を復元して編集 2: 2007-01-26 (金) 23:41:45 ソース バックアップ No.2 を復元して編集
Line 1: Line 1:
*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;
 +}