【ゼロからのOS自作入門】MikanOSをRustに移植する 6章前半

前回の続きです

ymzkmtfm.hatenablog.com

ゼロからのOS自作入門 | 内田 公太 |本 | 通販 | Amazon

↑の6章前半(day06b)まで移植しました。
後半は大分時間がかかりそうなので忘れる前に前半だけまとめます。

成果物

github.com

知識の整理

f:id:ymzkmtfm:20210506110726p:plain
PCIシステム想定図

6章は特に新しい知識が多かったので忘れないようにここに理解した分(PCI周辺)だけまとめます。
・バスとバスをつなぐ装置をブリッジと呼びます
・バス0、デバイス0はホストブリッジ、バス0、デバイス0、ファンクション0はPCIバスです
・IOポートはメモリではありません
・コンフィグレーション空間は1ファンクションにつき1つが基本構成っぽいです
・コンフィグレーション空間の実態はアクセスする方法が確立されているレジスタの塊です(たぶん)

もちろん細かい部分は構成次第だと思うので鵜呑みにはしないで下さい。
(例えばPCI-PCIブリッジは私の環境には存在しません)
そもそも PCI ってなに?ということに関しては以下の記事がイメージを掴みやすかったです。

www.buffalo.jp

商品としては以下の様なものなんかがありました。
PCI ボードに USB2.0 ポートが4つ搭載されてます)

www.amazon.co.jp

私はここで早とちりして「USBポートが4つあるならファンクションも4つあるのかな?」と思っていました。
しかしどうもそういうわけではないようです。
冷静に考えればUSBの最大接続数 256 (たぶん)はデバイスに搭載できるファンクション数 8 よりも圧倒的に多いので当然といえば当然です。
そもそも USB の制御を行うのは HCI 達なので PCI の領分ではありません。
あと、想定するシステムにおけるデータの読み込みと書き込みについても少し勘違いしている部分がありました。

f:id:ymzkmtfm:20210506111428p:plain
IN命令とOUT命令を使ったデータの読み込み

OUT命令はIOポートに対してデータを出力する命令で、IN命令はIOポートからデータを受け取る命令です。
なのでデータを読むためにはOUT命令とIN命令を両方使用しなければなりません。
ずっとIOポートの概念が理解できずにメモリに読み書きしているものだと思っていました。
アドレスとか出てきますがメモリとは関係ありません。
(本文にはしっかり書いてあります。太字で)

本物と違うところ

・探索を再帰的に行っていない
入手したデータの保存方法がうまく思いつかなかったので諦めました。
Rustの実装ではあり得る組み合わせを全探索しています。

感想

・USBは電源つけっぱなしで抜き差しできるけど、PCIって電源つけっぱなしで抜き差しできるんですかね?
C++の写経はそろそろ限界かも…
・でも実行結果を眺めるだけってのもいやだしもう少し頑張る