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
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