呼び出し前にそのエラー情報をpopしておく必要がある。割り込みディスクリプタテーブルは、構造としては256エントリのベクトルで、0から31番目まではCPUによって予約された割り込みに、それ以降はユーザ定義の割り込みに使用される。fault)が発生した場合など、特定の割り込みが割り込み処理中に発生した場合はダブルフォルト例外となる。ダブルフォルトの処理に失敗するとトリプルフォルトが発生し、これは通常ハンドルできず、システムリセットを起こしてしまう。ダブルフォルトは他の割り込み同様に割り込みハンドラによって処理することができる一方、ダブルフォルトが起きうる原因にはカーネルのスタックオーバーフローのような場合も考えられるため、専用のスタック領域を設けて設定する必要がある。そのようにしなければ、カーネルのスタックオーバーフロー時には、割り込み時のCPUによる例外スタックフレームのpushによって即座にページフォルトしてしまう。Segment)という構造上に設定する形になっている。TSSはGDTから読み込まれる。...このあたりは歴史的にこうなってるという解釈しかしていないので細かいところ自信がない。TSSは名前の通りタスクの状態を保持するための構造で、つまりコンテキストスイッチにハードウェアのサポートがあるわけだが、現在の主要なOSではコンテキストスイッチはソフトウェアレベルで行っているらしく、例えばLinuxではTSSはCPU毎に1つだけ用意して全てのコンテキストで共有されている。セグメントレジスタ群に良い抽象を与えてくれているが、これらの操作自体「そうなってる」といった感じになってしまう。ダブルフォルト用に静的に準備した割り込みスタック領域を指すようになるので、IDT側にこれを設定するとスタックが切り替わるようになる。IDT.load();}実際に試してみる。Mappingを設定しているため、ガードページが設定されておらず、スタックが伸び続けてダブルフォルトの割り込みハンドラの本体まで破壊してしまうのか、なんにせよ結果としてシステムリセットしてしまいうまくいかなかった。代わりに適当なアドレスのロードを試みることでダブルフォルトを確認できた。正しくダブルフォルト用に用意したスタック領域中の場所を指していることがわかった。(objdumpしたdouble_fault_handlerのアセンブリから確認できる)、割り込みハンドラに渡されたエラーコードだと思われる。Rustのメモリ管理の章を進める。Pagingページングの解説。よってどのように扱われるかが解説されている。ユーザーモードからのアクセス性やwritableなどのフラグとして用いられているページテーブルの変換は当然高コストなので、CPUは内部的にキャッシュを持つ。page)で、指定されたページの変換をTLBから取り除く。Implementationページテーブルをどう構成するかの案色々。再帰ページテーブルが少し面白くて、ページテーブルの適当なインデックスから自分自身を指すようにページテーブルを構成することで、ページテーブル自身へのマッピングが出来る。似ていて、そのまま実装できそうだ。次は、MikanOS本にもページングの章があるので一度そちらを確認してみる。(MikanOS)アドレス変換とx64での階層ページングの解説。Rustで解説されているものと同様。(アプリケーションの実行については今後の実装になる)。階層構造のページテーブルの変更は再帰的な関数によって行われる。x86_64クレートのmapped_page_table.rsにも似たような実装があるが、MikanOSでは前述のとおりカーネルを低位アドレスで動かしているのを含めて物理メモリがアイデンティティマッピングされている状態なので、ページフレームの物理アドレスをそのまま仮想アドレスとみなして、ポインタにキャストして使用することができる。Managementを読み進めることにする。x86_64クレートが高レベルの抽象も提供しているが、MikanOS側に寄せていくつかは手動で実装していく。適合するアロケータを実装することで、カーネル上でもallocクレートによって提供される動的なアロケーションを伴うコレクションを利用できるようになる。Rustの実装に倣って確保したフレームを分割して返す実装を行った。アロケータの実装では、確保したフレーム上の未使用領域自体をアロケートのための情報をストアする領域として使用できるのが少し面白いところ。PICは使用したくなかった[1]ので、xv6の実装を参考にAPICのサポートを試みる。キーボードからの割り込み要求を処理することを考える。APIC関連の制御のためのシステムの情報を取得するAPIC関連のレジスタはメモリマップドI/Oでアクセスできるが、このアドレスは完全な固定値というわけではなく、マルチコア等のマシン依存の情報などを含めてまず情報を取得する必要がありそうだった。