2021/10/16しばらくxv6の実装を追ったりLinuxのデザインを追ったりで間が空いてしまった。orsの実装もMikanOS書の流れからだいぶ離れたものになった。コミットを振り返りつつ備忘録としていく。サポートしているxv6の実装を参考に、はじめからマルチコアを意識した実装にすることにした。手始めに、xv6に倣ってCPUローカルな状態を持てるようにする。プロセッサごとの状態を表現している。IDを読むことで区別していた。APICはコアごと内臓されており、それぞれのコアで固有な値が得られる。現在のプロセッサ上での状態を持てるようにした。IDなどの情報はこれまでの実装で既に得ている。PlatformInfoのprocessor_infoに含まれる。別の方法としては、今ではほぼ使われないセグメントレジスタを用いる方法もあるようだ。2021/10/16https://zenn.dev/link/comments/8710d30d5a3da6上のスクラップでも触れたが、マルチコア対応も視野に入れて再び排他制御について考え直す。シングルコア前提では割り込みを無効にすれば済んでいたところ、マルチコアでは別のコアからも同じリソースにアクセスされるので排他制御が必要になる。スピンロックを排他制御に用いると、割り込みによってリソースのロックを獲得したまま制御が移ることで容易にデッドロックを引き起こしてしまう。考慮しなければならない範囲が特定の割り込みハンドラ群のみであれば、それらのハンドラから触れるリソースについてだけ考えれば良かった。これから実装するコンテキストスイッチも含めると、考慮しなければならない範囲が広く、割り込みの有効/無効とスピンロックを個別に管理するのは非常に難しい。されるまで割り込みが無効化される。これと似たような仕組みを実装する。x86_64クレートにはwithout_interruptsという似たようなユーティリティが存在するが、クロージャによるスコープベースだと扱いづらいのでRAIIで表現することにした。}}割り込みの有効/無効はコアごとなので、上で用意したCPUごとの状態を活用している。自体はスピンロックを用いて排他制御している。(Aliasingに気を付ける必要はありそう)、xv6はそのように実装されているが、orsではとりあえずロックしている。保持させることでロックを獲得している間は割り込みが無効となるようにする。order.とのことなので、MutexGuardの宣言では最後にCliがDropされるように並べる。排他制御が必要な各種リソースに用いることで、リソースの排他制御に関して、マスク可能な外部割り込みについて考慮する必要はなくなる。これらリソース自体はコンテキストスイッチング等で引き続き考慮することになる。(情報工学))を保存したり復元したりする過程のことである。コンテキストスイッチはマルチタスクオペレーティングシステムに不可欠な機能である。通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。コンテキストスイッチは、MikanOS本の流れを踏襲してほとんどのレジスタの値を退避する形で実装した。2021/10/16に更新タスクスケジューラhttps://github.com/yubrot/ors/blob/main/ors-kernel/src/task.rsMikanOSとxv6を参考に、タスクの仕組みを実装した。タスクはコンテキストとそのコンテキストのためのスタック領域や、いくつかの付加情報を保持する。(プリエンプティブマルチタスク)。