タスク

Murax64 においてタスクは、仮想メモリーをもつ実行単位で、スケジューリングの対象になる。
POSIX のプロセスやスレッドもすべてタスクで、サーバーはタスクであるがプロセスとして登録しないので、プロセスではない。
サーバーやユーザープログラムは、ユーザータスクとしてユーザーモードで実行が開始され、割り込みやシステムコールによって、カーネルモードに移行し、 割り込みやシステムコールのリターン命令で、ユーザーモードに復帰する。
スレッドサーバーのコードとデータは、スレッドサーバー割り当て開始アドレスから、1Gバイトづつ割り当てる。
タスク構造体 struct task は、kern/x86_64/task.c で定義されている。

仮想メモリーレイアウト kern/x86_64/task.c kern/elf_x86_64_kern.ld elf_x86_64.ld

0x100000カーネル開始
 
0xFFFE0000000000005レベルページング時のスレッドサーバー割り当て開始、ここから1Gバイトづつ割り当てる
0xFFFFFE80000000004レベルページング時のスレッドサーバー割り当て開始、ここから1Gバイトづつ割り当てる
0xFFFFFF0000000000ユーザータスク開始
 
ユーザースタック、ユーザー・サーバー・スレッドサーバー共通
0xFFFFFFFFFFFFB000ユーザースレッドデータ、ユーザー・サーバー共通(スレッドサーバーは1Gバイト内に持つ)
0xFFFFFFFFFFFFD000カーネルスタック
0xFFFFFFFFFFFFE000カーネルスレッドデータ
0xFFFFFFFFFFFFF000タスク構造体

タスクの作成 kern/x86_64/task.c

task_create_boot_task()
boot 時に各 cpu で最初に実行される仮想メモリーを持つタスクを作成する。
これは、cpu に実行するタスクがいなくなったときにスケジュールに追加され、割り込みに対応する。
もし別のタスクがスケジュールに追加されたら、スケジュールから削除される。

task_create_server()
サーバータスクを作成する。

task_create_user()
最初のユーザータスク sbin/system_init (これのみ)を作成する。
このタスクは、最低限必要なシステムのセットアップを行い、init プロブラムを呼び出して終了する。

task_fork()
ユーザータスクのコピー(子プロセス)、またはクローン(スレッド)を作成する。

タスクの遷移 kern/x86_64/task.c

task_exec_load()
タスクのプログラム(コード、データ)を別のものに置き換えて、実行開始する。

タスクの終了 kern/x86_64/task.c

task_exit()
ブートタスク(task_create_boot_task())に移行して、最後、タスクの仮想メモリーマップの物理アドレスを開放する。