verify_area 手続き
意味分からん、と言いつつ system_call.s の signal 云々を見てたり。
bsf とか btr とか
Bit Scan Forward とか Bit Test with Forward とか。current->signal が 32bit の bitmap になってます、ってコメントがある。
BSF は
Searches the source operand (second operand) for the least significant set bit (1 bit). If a least significant 1 bit is found, its bit index is stored in the destination operand (first operand).
で、BTR は
The destination bit indexed by the source value is copied into the Carry Flag and then cleared in the destination.
との事。BSF は全部ゼロの場合の動作は未定義という記述がありましたが、0.01 だと zero が戻るとの事。
で、signal handler がぬるぽ以外の場合、凄く微妙なスタック操作をしておられます。戻った後に signal handler が動くようにしてるのだろうか。
と言いつつ
色々見てるんですが、
reschedule: pushl $ret_from_sys_call jmp schedule
で、schedule() に jmp した後にはどこに戻るんだろう。ret_from_sys_call?
ええと call した時のスタックの状態とかをリハビリの必要あり。多分スタックに戻り番地セットされるはずなので、ret_from_sys_call に戻るのか。
追記
しかも内容と表題がマッチしていないorz
てゆーか verify_area 手続きがやっぱ意味分からん。とは言え 2: なラベル以下のシグナル云々な処理についてはなんとなく_次_を無理くり変更してるってのは分かるんですが、restorer の根拠だったり default_signal なあたりも若干微妙。
とりあえず書ける分だけ書いてしまって signal あたりの実装の理解が微妙なので、ってコメントに控えておく方向でナニ。
てか、
movl sig_fn(%eax,%ecx,4),%ebx # %ebx is signal handler address cmpl $1,%ebx jb default_signal # 0 is default signal handler - exit je 2b # 1 is ignore - find next signal
0 とか 1 とか何だよ、って思ってたら定義されてたorz
#define SIG_DFL ((void (*)(int))0) /* default signal handling */ #define SIG_IGN ((void (*)(int))1) /* ignore signal */
あと
void (*signal(int _sig, void (*_func)(int)))(int);
な宣言? 定義? の意味を分かりかねてたりしてorz
そうか
signal は signal handler なポインタを戻すのか。signal の man と意味てきには同じって思ってりゃ良いのか。
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);やれやれ。意味合いてきには
- signal は int な一引数の関数ポインタを戻す int 型と int な一引数の関数ポインタ型な引数を受け取る関数です
って事ですか。