RSDP")}これをカーネルに渡して、カーネル側でそれをパースする。パースにはacpiクレートが利用できる。このスクラップの上の方でハードウェア割り込みには諸々の処理にアロケーションを伴いそうなのでと書いたのはこのクレートのためだが、自前でパースすればアロケーションレスにするにも特に不都合は無さそうだった。これは仮想アドレスと物理アドレスのマッピングのためのトレイトだが、MikanOSではアイデンティティマッピングを採用しているので、物理アドレスはマップ処理を伴わずそのまま仮想アドレスとして解釈できる。WikipediaMikanOSでも今後の章でAPICは出てくるようなので、細部の仕様は追わず、とりあえずxv6の実装を粛々と移植していく。キーボードのようなデバイスからの割り込み要求(IRQ)を割り込みコントローラ(今回はAPIC)が認識して、想定した割り込みハンドラによる割り込みで処理されるように設定することになる。APICのためのものであることに注意したい。CPUの割り込みフラグは関係しない。実装上は以下のような形となった。IDT.load();}USBの場合の割り込みについては、MikanOS本を読み進めつつ後ほど書きたい。割り込みとFIFOx86_64での割り込みについて。Rustの流れで行っていた。MSI割り込み前述の疑問の答えがすぐに出てきた。割り込みの発生方法として、PCI規格が定めるMSIを採用している。APICに割り込みが送られるようだ。使ってる部分の排他制御について考え直す。Harmfulhttps://www.kernel.org/doc/Documentation/locking/spinlocks.txt今回特に気を付けなければならないのは割り込みハンドラの実装だろう。割り込みハンドラがロギングをしていて、ロギングの実装がシリアルポートへの書き込みのためのロックを取得しようとしているとする。このとき、割り込み前の処理がちょうどシリアルポートをロックしていた場合、割り込みハンドラ側のロックの取得は失敗し、かつ割り込みから返る手段も無いためデッドロックとなってしまう。スピンロックの獲得の前にそのCPUでの割り込み要求の受付を停止することで、スピンロックのクリティカルセクションがそのCPUで速やかに実行されるようにする。lockを使ったより効率的な方法などが示唆されている。xv6はかなり保守的になっている。spinlockは常にpushcli/popcliを呼び出していて、まあつまりスピンロックを獲得する時は常に割り込みを止めている。割り込みハンドラが触れるデータ群の排他制御には一層の注意を要する。APICもタイマー機能を持っていて、定期的にCPU内で割り込みを発生させたりもできる。MikanOS本ではベンチマークのために、xv6では割り込みのために使用されている。空の割り込みハンドラを設けて割り込みが発生するようにだけしておく。2021/10/21に更新グラフィック周りは好きにやろうと思いつつも、どうしようかなあと考えていたところで端末のエスケープコードを思い出す。X3.64といった標準仕様や現在の端末エミュレータの実装もこれのサブセットあるいはスーパーセットとなっているようだ。vimのようなアプリケーションは直接エスケープコードを吐くことは少なく、terminfo/termcapによって端末のエスケープコードを得て使っているようだ。現在の端末の対応表が見られる。ユーティリティによってこれを試すこともできる。文字色を赤にした出力を試せる。ウィンドウフレームバッファの実装を参考に描画を高速化した。本書の流れに則ってない。Rustの流れでサポート済みなので、タイマ処理を改善する。Timerの周波数はハードウェア依存でまちまちなので、別のハードウェアタイマーを使ってこの周波数を計測し、およそ10ms間隔で割り込みが発生するように調整する。Timerの周波数を計測できる。読む流れを自前実装しなくて済む。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。