タスク管理を追加しました

x86(32ビット)用OSを作っています - へにゃぺんて@日々勉強のまとめ
こちらの記事から引き続き、OS作りを少しずつ進めていました。
一応、「タスク管理」と呼べるものが実装できたので、記事にしておきます。

ソースコード

前回の記事と同じくGitHub上で開発を進めています。

使い方もなどもこちらを参照してください。


今回の記事の時点のタグを追加しました。
この記事時点のものは、"blog-20150824"のタグをチェックアウトするか、
以下のURLからダウンロードしてください。

タスク管理について

今のところ、マルチタスクで動作するタスクは以下の2つ固定です。

  • シェル
  • 起動時間(右上の"uptime")
    • 16進表示の起動秒数カウンタ


タスク管理にはx86のタスク管理機能を使っています。
なので、TSS(Task Structure Segment)というタスクのコンテキスト(主にレジスタ情報)を管理する構造を
タスクの数だけメモリ上に確保、初期化し、コンテキストスイッチはTSSへのjmp命令で行っています。


jmp命令にTSSのアドレスを指定するとx86 CPUは、

  1. これまで動作していたタスクのTSSにレジスタ情報を退避
  2. jmp命令で指定したTSSのレジスタ情報を復帰し、タスクの実行再開

というコンテキストスイッチ処理を行ってくれます。


そして、このコンテキストスイッチを10ms周期のタイマー割り込みで行うことで、
マルチタスクを実現しています。


その他の追加・修正

主に以下のとおりです。

  • キー入力に追随した自動スクロール追加
  • BSキー対応
  • コマンド追加
    • メモリ読み出し: readb, readw, readl
    • メモリ書き込み: writeb, writew, writel
    • I/Oポート読み出し: ioreadb
    • I/Oポート書き込み: iowriteb