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つのタスク)を実装する。
bootpack.c
の修正bootpack.h
の修正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つのタスク)を実装する。
mtask.c
の新規作成bootpack.c
の修正bootpack.h
の修正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) { (略)
一応、それっぽく実行できるが、根本的な解決にはなっていない。