V6のx86(32bit)実装の教育用OSです。本記事はswitchingがどう実装されているかの解説記事です。switchingの記事、2018/11時点ではあんまり需要なさそうので、この次のinterruptについての記事はcontribution数が相当増えない限り、多分公開しない予定です。バージョン固定せずにかなりラフにinstallしても動くようだ。system関連での参考文献としてあげましたマルチタスク処理とswitchingとinterruptの関係マルチタスク処理とは複数のprocessをあたかも同時並行に動かす処理です。実際には、1~10ms単位でCPUが複数のprocessを切り替えることで、OS使用者にとって同時に動いているように見せます。この切り替わるタイミングですが大きく分けて二つあります:RUNNINGの状態のprocessがwaitやexitすることにより、状態が切り替わるときtimerによるinterruptで強制的に別のprocessに切り替えるとき前者は、別のRUNNBALEの状態のprocessを動かしたいので、スループット向上のため、現行のprocessを左記のprocessに切り替えます。これでは不便なので、ある一定の時間が経過したら強制的に(といっても今までの設定を保存して)別のprocessの作業に切り替えます。雑に言うと、この切り替わりの動作のことをswitchingと言い、別の要因(この例だとtimer)による中断をinterruptと言います。新しい方のprocessの設定を復元する(中断したものが再開するので)必要があります。Controller)の話からする必要がありそうで、かなり長くなりそうなので、別の記事にまとめたいと思います!全体の流れこの記事では、特にswtch関数から、%eipと%espが活躍しまくります。この2つのregisterの意味合いについて把握していないと、ほとんど意味不明になってしまいますので、あまりよくわかっていない方は第一回目の%espと%eipの記事に目を通しておいてください。上のprocessをprocAと呼ぶことにする。processが動き出します。子プロセスがexecを介してshell実行すると言う流れです。instruction実行でprocBに飛ぶとなります。swtch関数の直前まで追っていきたいと思います。registerに格納されるところから、スタートです。このstackが後のschedulerを実行させるときのstack領域となります。spaceを使用可能状態にします。tableの領域確保のために必要と思われる領域だけを使用可能状態にしていたのですが、各種初期設定が完了しているので、使用可能な領域を広げます。説明しているので、そちらをご覧ください(独立して読める話になっています)図としてはこんな感じ:(%espの位置については、entry.Sで用意されたstack領域内にあること以外は、どの位置にあるかの関心は現状あまりないので、適当につけています。cpus[NCPU];と定義されていて、global変数です。procA以下のコードprocAの状態をRUNNABLEに切り替える部分についての説明をしたいと思います!_binary_objfile_startと_binary_objfile_sizeについてuserinitにある_binary_initcode_startや_binary_initcode_sizeという謎の変数が急に登場しています。externなので、どこか外部から引っ張ってきているみたいです。binaryを抜き出しています。生成していることがわかります。symbols.とのことです1。nextpid++;ここの部分は、UNUSEDの状態のprocessを選択する部分です。ptableはglobal変数なので、静的に領域が確保されています。ここで、選択されたprocess(変数p)を以下procAと呼ぶことにします。