scheduleを実行する前段階としては、proc->stateをWAIT状態にするwait_queueのlistにこのproc(正確には、このprocをpointerにもつwait_queue_t型の変数)を登録する。+終わったら、wait_queueのlistからこのprocを除くというのがよくある流れっぽい。switch_toの直前のプロセスをProcessAとする。__switch_toが終了する直後)に別プロセス(ProcessB)に移行するので、今までRUNNINGしていたプロセスが眠りについて、別の(wait状態の)processがまたRUNNINGに移行する。このように、次から次にprocessが移行していく。landに権限昇格しているわけではない。(Kernel領域で作業していることには変わらない。)当然ProcessAはまだ完了しているわけでないので、しばらくすると、ProcessAに主導権が再び得られることになる。__switch_to\n"から処理がスタートしてProcessAで使っていたregisterたちを次々と復元していく。雰囲気的にはこんな感じだが、実際のコードをみていく。assemblyなので慣れないとなかなかむずい。そこで、ひとつずつコードを紐解いていきたい。__switch_to`が終了したときに`"1:\t"`のラベルのアドレスまで飛びたいので。stackjmp命令がとても重要で、この命令があるので、別プロセスへと移動できる。[next<-thread.eipの中身]にて手動でアドレス値をスタックに積んでいて、これが戻った先のaddressと解釈されて、別プロセスの関数へと移動できるわけだ。outする感じに似ている。processのstack上で作業することになる。registerにpopする次のinstrcutionは%eipの指示す先で、これは次なるプロセスの文脈のアドレス("1:\t"のラベルのアドレス)になる。processのstackを基準にいろんなregisterが復元される。processのesp0を保存している。init_tss);とあるので、CPUごとに一つだけ存在する変数である。1続いてコードを詳細に追っていく。popflまでがアセンブリ命令でそれ以外はオペランド制約というものに分かれている。bの方向に代入すると考えればわかりやすい。jmp命令は上記の通り。ret命令との違いを認識できてるかどうか。\オペランド制約は並んでる順番は意味があって、1つ目のオペランド制約が%0に対応する。"2"とかあったら、%2を使う。=は出力で、後続の変数に値を流し込んでいく。[last変数のaddress]何もついてなければ入力で、後続の変数からregisterかメモリ上の指定されたアドレスに値を書き込んでいく。valueがregisterではなくメモリ上のアドレスなので、mを指定している。functionとあるので、次回に回す。部分で指定したものがswtch関数のret命令後に効いてくる。Glosaryの節を参照のこと。callの内部実装の違い(xv6を例に)月別アーカイブはてなブログをはじめよう!knknkn11626さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。