タスク
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 | カーネル開始 |
| 0xFFFE000000000000 | 5レベルページング時のスレッドサーバー割り当て開始、ここから1Gバイトづつ割り当てる |
| 0xFFFFFE8000000000 | 4レベルページング時のスレッドサーバー割り当て開始、ここから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())に移行して、最後、タスクの仮想メモリーマップの物理アドレスを開放する。
task_create_boot_task()boot 時に各 cpu で最初に実行される仮想メモリーを持つタスクを作成する。
これは、cpu に実行するタスクがいなくなったときにスケジュールに追加され、割り込みに対応する。
もし別のタスクがスケジュールに追加されたら、スケジュールから削除される。
task_create_server()サーバータスクを作成する。
task_create_user()最初のユーザータスク sbin/system_init (これのみ)を作成する。
このタスクは、最低限必要なシステムのセットアップを行い、init プロブラムを呼び出して終了する。
task_fork()ユーザータスクのコピー(子プロセス)、またはクローン(スレッド)を作成する。
task_exec_load()
タスクのプログラム(コード、データ)を別のものに置き換えて、実行開始する。
タスクの終了 kern/x86_64/task.c
task_exit()
ブートタスク(task_create_boot_task())に移行して、最後、タスクの仮想メモリーマップの物理アドレスを開放する。
task_exit()ブートタスク(
task_create_boot_task())に移行して、最後、タスクの仮想メモリーマップの物理アドレスを開放する。