30日でできる!OS自作入門パート10(15日目①)

気がつけば1カ月ほど空いてしまいましたがまだ終わっていません。ということで続けていきます。

今回のサブタイトルは『マルチタスク-1』です。

 

マルチタスクをCPUにさせるには?


実はCPUが1つしかなくてもマルチタスクはできているようです。その場合同時に複数のプログラムを動かしているのではなく、忍者の分身の術のようにAのプログラムを少し動かして次にBのプログラムをちょっと動かして…と処理しているようです。そうなるとこの切り替えを高速にしないと同時に動かしているように見えないですね。このプログラムの切り替えを「タスクスイッチ」と言うようです。

CPUにタスクスイッチをしなさいと命令するとCPUはレジスタの値をすべてメモリに書き込みます(後で実行を再開するため)。その後にこれから実行するプログラムのためにメモリから全部のレジスタの値を読み込みます。これで切り替えは完了となります。

 

レジスタの内容はどのようにメモリに書き込まれるのか?


このコードはTSS(タスク状態セグメント)というものでこれをつかってレジスタの内容をメモリに書き込みます。TSSはintが26個集まったもので全部で104バイトです。

1行目はタスクの設定に関する内容、2行目は3bitのレジスタ、3行目は16bitのレジスタです。4行目のldtrとiomapは1行目と同じくタスク設定に関する部分です。

 

タスクスイッチしてみる


ということでタスクスイッチをしてみます。タスクAとタスクBを準備してAからBへ切り替えます。まずはTSSを二つ作る必要があります。

メインクラスにTSSの呼び出しを書き、ldtrとiomapに適当な値を代入します。

 

ここまで出来たら実際に切り替えをします。

続きは次回


マルチタスク-1はここでまだ半分です。なかなか手強いので15日目は2つにわけたいと思いますので今回はここまでです。

 

スポンサーリンク

soon
  • soon
  • 1986年生まれのjavaプログラマー。28歳の時に7年働いた販売士からプログラマーに転職をする。常駐先を転々としながら日々生きています。