タスク管理を追加しました
x86(32ビット)用OSを作っています - へにゃぺんて@日々勉強のまとめ
こちらの記事から引き続き、OS作りを少しずつ進めていました。
一応、「タスク管理」と呼べるものが実装できたので、記事にしておきます。
ソースコード
前回の記事と同じくGitHub上で開発を進めています。
使い方もなどもこちらを参照してください。
今回の記事の時点のタグを追加しました。
この記事時点のものは、"blog-20150824"のタグをチェックアウトするか、
以下のURLからダウンロードしてください。
タスク管理について
今のところ、マルチタスクで動作するタスクは以下の2つ固定です。
- シェル
- 起動時間(右上の"uptime")
- 16進表示の起動秒数カウンタ
タスク管理にはx86のタスク管理機能を使っています。
なので、TSS(Task Structure Segment)というタスクのコンテキスト(主にレジスタ情報)を管理する構造を
タスクの数だけメモリ上に確保、初期化し、コンテキストスイッチはTSSへのjmp命令で行っています。
jmp命令にTSSのアドレスを指定するとx86 CPUは、
というコンテキストスイッチ処理を行ってくれます。
そして、このコンテキストスイッチを10ms周期のタイマー割り込みで行うことで、
マルチタスクを実現しています。
その他の追加・修正
主に以下のとおりです。
- キー入力に追随した自動スクロール追加
- BSキー対応
- コマンド追加
- メモリ読み出し: readb, readw, readl
- メモリ書き込み: writeb, writew, writel
- I/Oポート読み出し: ioreadb
- I/Oポート書き込み: iowriteb