非情報系インフラエンジニアの情報系お勉強

OS自作、ネットワーク、セキュリティの備忘録

OS自作入門 15日目/30日(マルチタスク)

OS自作入門 15日目/30日(マルチタスク

1.はじめに

15日目では、マルチタスクを実装する。

2.新しい単語とか

TSS(Task Status Segment)

タスクスイッチをする際に、レジスタの内容をメモリに書き出したり、メモリからレジスタに読み込む際に使用するセグメント。intが26個で構成されている。(4*26=104byte)

struct TSS32 {
    int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; /*タスクの設定に関する情報*/
    int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi; /*32bitのレジスタ*/
    int es, cs, ss, ds, fs, gs; /*16bitのレジスタ*/
    int ldtr, iomap; /*タスクの設定に関する情報*/
};

EIP(Extend Instruction Pointer)

次に実行する命令のアドレスを保持するレジスタ

TR(Task Register)

実行しているタスクの値を保持するレジスタ

3.harib12a,b,c,d

マルチタスク(2つのタスク)を実装する。

  1. bootpack.cの修正
  2. bootpack.hの修正
  3. asmfunc.asmを修正
No. 対象ファイル 修正内容
1 bootpack.c task_b_mainや、tssの初期設定などマルチタスクに必要な処理を追記
2 bootpack.h void load_tr(int tr);#define AR_TSS32 0x0089の追記
3 asmfunc.asm 関数load_tr, farjmpの実装

4.harib12e,f,g

mt_taskswitch関数を用いたマルチタスク(2つのタスク)を実装する。

  1. mtask.cの新規作成
  2. bootpack.cの修正
  3. bootpack.hの修正
  4. timer.cを修正
No. 対象ファイル 修正内容
1 mtask.c マルチタスク用のソースファイルの作成
1 bootpack.c 上記追加に伴う修正
2 bootpack.h mtask.c用の宣言等を追記
3 timer.c 関数void inthandler20(int *esp)の処理を修正
6 Makefile 下記の通り修正
# --- オプション
CFLAGS = -c -m32 -march=i486 -fno-pic -nostdlib

# --- ファイル名
IMG=haribote.img
IPL=ipl.bin
HD=asmhead.bin
FASM=asmfunc.asm
FOB=asmfunc.o
BT=bootpack.c
BHRB=bootpack.hrb
LD=har.ld
HSYS=haribote.sys
MFONT=makefont.c
OFONT=makefont.o
FONT=font.c
CSPR=orisprintf.c
OTBL=dsctbl.o
OGRA=graphic.o
OINT=int.o
OFIFO=fifo.o
OKEY=keyboard.o
OMOUSE=mouse.o
OMEM=memory.o
OSHEET=sheet.o
OTIMER=timer.o
OMTASK=mtask.o

MAKEBHRB=$(BT) $(FOB) $(FONT) $(CSPR) $(OTBL) $(OGRA) $(OINT) $(OFIFO) $(OKEY) $(OMOUSE) $(OMEM) $(OSHEET) $(OTIMER) $(OMTASK)

#--- フォントの作成
$(OFONT) : $(MFONT)
    gcc $(MFONT) -o $(OFONT)

$(FONT) : $(OFONT)
    ./$(OFONT)

#--- イメージファイルの作成
$(FOB) : $(FASM)
    nasm -g -f elf $(FASM) -o $(FOB)

$(BHRB) : $(LD) $(MAKEBHRB)
    gcc -march=i486 -m32 -fno-pic -nostdlib -T $(LD) -g $(MAKEBHRB) -o $(BHRB)

$(HSYS) : $(HD) $(BHRB)
    cat $(HD) $(BHRB) > $(HSYS)

$(IMG) : $(IPL) $(HSYS)
    mformat -f 1440 -C -B $(IPL) -i $(IMG) ::
    mcopy $(HSYS) -i $(IMG) ::

# 一般規則
%.bin : %.asm
    nasm $*.asm -o $*.bin

%.o : %.c
    gcc $*.c $(CFLAGS) -o $*.o

# コマンド
img :
    make $(IMG)

dump :
    hexdump -C $(IMG)

clean :
    rm -f *.lst *.bin *.sys *.img *.hrb *.o $(OFONT) $(FONT) $(OSPR)

テキストの通りに修正をすると13日目と同じように、動作が非常に遅くなった。解決策として

void task_b_main(struct SHEET *sht_back)関数内のforループの直下に下記内容を追記した。

(略)
    for (;;) {
        count++;
        orisprintf(s, "%d", count);  ///////////追加
        putfonts8_asc_sht(sht_back, 0, 160, COL8_FFFFFF, COL8_008484, s, 11);  ///////////追加
        io_cli();
        if (fifo32_status(&fifo) == 0) {
(略)

一応、それっぽく実行できるが、根本的な解決にはなっていない。