OSとは関係ないのですが大津波で助かった人の過酷な様子がわかる文章です。
http://blog.goo.ne.jp/paddy1004/e/c03b9cb94a06c0328cbcb42f1486b11d

なんか凄い文章読んだなって気がしました。
①スレッドを実現するためには、スレッドリストの構造が必要。
スレッドはリストに登録され、その順番にスレッドがscheduleされて、レジスタにスレッド固有の内容が反映されdispatchされる。

②スタートスレッド
スレッドリストを作るための処理が必要でそれがスタートスレッドで実施される。
起動の最初の処理として、まずスタートスレッドをスレッド登録し無理やりディスパッチする。
それというのもKOZOSの設計はスレッドからシステムコールを実施することができる設計になっているから。
ロケットが衛星軌道に達するためには多段式でないとだめなようなのだが、打ち上げ台がbootloaderで第一ロケットがスタートスレッドで途中で切り離され、コマンドスレッドが衛星軌道で活躍するようなイメージかな。

③システムコール
システムコールを実施するときはソフトウェア割込みを実施する。
システムコールを実施する理由は2種類用意されていてスレッドを登録するためのRUNとスレッドを終了させるためのEXIT。
その処理が終了するのを契機にスレッドリストに登録されている次のスレッドを選択し動作させる。
いわばシステムコールはスレッド切替の1つのタイミングになっている。
kzload> run
starting from entry point: ffc020


■■STARTスレッドを登録しディスパッチする■■
■kz_start
B
■setintr
H
■setintr
H
■thread_run(STARTスレッド登録)
A
■dispatch S kz_start
@

※turead_run関数を呼び出してSTARTスレッドをcurrentにして即ディスパッチし動かしている。
※start_threads関数を呼び出すようにする。



■■登録したSTARTスレッドをディスパッチして動かしている■■
■thread_init

===============================================
I
■start_threads
stt
■kz_run
rn
■kz_syscall
Z

※kz_syscallが呼ばれたとき以下を設定。
current->syscall.type
current->syscall.param
それで割込み発生させる。
※thread_init関数は登録したスレッドをdispatchしたときに呼び出される関数でthread_run関数でスレッド登録時プログラムカウンタとして指定している。
※start_threads関数が無事呼び出されたわけだが処理の中身はさらにスレッドを登録するための関数としてkz_run関数が呼び出されさらにkz_syscall関数が呼び出されている。
※割込み発生させてトラップさせるときはプログラムカウンタはおそらくthread_end関数をさしているのだろう。これは後述の★処理1★のところで戻される。



■■システムコールを実施しスレッドを登録■■
■ここでレジスタを退避させる。
ここに退避した内容はどこに保存されているか?

■thread_intr
W
■handlers START
1
■syscall_intr
Q
■syscall_proc
sp
■call_functions
U
■thread_run(COMMANDスレッド登録)
A
■handlers END
2
■schedule
Y
■dispatch START
-

※ここでdispatchした内容というのはSTARTスレッドのコンテキストの内容だがそれはzk_syscall関数を実施した時点の内容のようだ。★処理1★
※thread_runの時点でcurrentはCOMMANDスレッドだがschedule関数でSTARTスレッドをcurrentにしSTARTスレッドをdispatchし★処理1★で示すように次thread_end関数にいく。



■■STARTスレッド終了■■
■thread_end

■kz_syscall
Z

※システムコールを実施しスタートスレッドを終了させる。
※一番最初にintr_syscall関数が呼び出され現状のレジスタ★状態2★をスタックに退避してinterrupt関数を呼び出しその延長上でthread_intr関数が呼ばれるcurrentが消える。



■■システムコールを実施しSTARTスレッド終了■■
■thread_intr
W
■handlers START
1
■syscall_intr
Q
■syscall_proc
sp
■call_functions
U
■thread_exit(STARTスレッド削除)
E
■handlers END
2
■schedule
Y
■dispatch START
-

※COMMANDスレッドがcurrentになりdispatchされるのだろう。




■■登録したCOMMANDスレッドを早速ディスパッチして動かしている■■
■thread_init
I
■test08_1_main

* t08