Tutorialも参考。セグメントレジスタの更新によってGDTが読み込まれ、カーネルが用意したGDTによって動作するようになる。ソフトウェアの指定するアドレスはリニアアドレスであり、ページテーブルを通して物理アドレスに変換してからメモリの読み書きが発生する[1]。ページングは19章で詳しく扱うが、ここではアイデンティティマッピングを設定する。文字通り、リニアアドレスと物理アドレスをそのまま対応させるマッピングとなる。この辺はRustでもひたすらやるという感じ。2021/07/19メモリ管理メモリ管理は、ここまでお膳立てが済んだので粛々と行うという感じ。物理アドレス領域をページフレーム単位(例では4KiB)で区切り、アロケート済みかどうかのフラグをビットマップフラグの配列で持つ。与えられたメモリマップ情報をもとに、利用可能でない領域を事前にアロケート済みとマークする。コンパイル時に埋め込むことができる。core::fmt::Writeの実装を与えれば利用できる。型がこのトレイトを実装するようにした。logクレートの実装を与える形で。適切な形に置き換わるかと思う。情報を出力できるようになる。用いているが、コンソール出力を使えば何でも良いだろう。長さを保持しているが、ヒープアロケーションを伴わないデータ構造にheaplessクレートを採用した。他にRust特有っぽい話はない。I/O空間の読み書きのような簡単な命令であればインラインアセンブリが使える。2021/07/23USBホストドライバ非常にしんどい。I/Oのベースアドレスは取得できたが、ここからの処理が本書では著者謹製のUSBホストドライバを使用している。APIを通して使用するのも面倒だ。移植が困難な理由に、USBのホストドライバ実装に比較的興味がないということもあり、PS/2のハンドリングが簡単であればそちらでお茶を濁そうかなと考えている。これを言ってしまうとウィンドウなどのグラフィカルな処理にも興味が無いので、本書の流れをトレースすることから大きく外れてきそうだなあと思われる。Rustではどうやっているかなあと見てみることにする。BIOSの手法の差異が見られて少し面白い。RustのほうではVGAテキストモードを使用しているが、これもUEFIではサポートされていないらしい。あり、これはLinuxにおいてはGPUドライバが存在しない環境で使われているとのこと。PICはUEFIではサポートされないが、APICはacpiクレートなどの助けによって使うのが非常に困難ということはない。Rustを参考にいくつか改善を施す。QEMUが立ち上がるようにする。'../target/x86_64-unknown-uefi/debug/ors-loader.efi']x86_64クレートを用いてインラインアセンブリの記述やアセンブリによる実装を減らした。後の割り込み対応では、合わせてGDT周りもx86_64クレートの提供する高レベルなAPIを使用する形にした。シリアルポートにログを出力するように。uart_16550クレートのおかげでかなり簡単。テストが実行できるように。普通にQEMU上で動くようになる。Bonesの章が終わった相当になる。このままInterruptsの章を進めてからOS自作入門の6章以降を拾っていく形にしようかなと考えている。Managementの章まで進めてしまっても良いかもしれない。WikiCPUによるエラー。(としてx86系では実装されている)。CPUは、ページフォルト、アクセス違反、無効な命令コード等に遭遇すると、割り込みとして例外処理に入る。x86_64において割り込みは、事前に登録しておいた割り込みハンドラが呼び出されることで処理される。サポートはこの大部分を抽象化してくれている。IDTの構築はお馴染み仕様によって定められたデータ構造の構築が必要だが、x86_64クレートはこれをうまく型付けして抽象化した形で提供している。"x86-interrupt"呼出し規約とx86_64クレートによって満たされるようになっている。retのような)呼出の境界に関係なく発生するため、通常の呼出規約において保持されていればいいレジスタ群と異なり全てのレジスタが保持される必要がある。割り込みハンドラとなる関数は使用するレジスタ全てについて事前にpushするなどして保持しておく。