はじめに
以前、PCIについての記事を書いたのですが、わかったようなわからないような感じだったのでもうちょっと勉強してみました。
なんとなく分かってきた気がしています
8割方、気のせいだと思います。
最初にたどり着いたのがQiitaのページです。そこから東北学院大学のページを知り、読んでみました。
- PCI ボードをデバイスドライバを用いずに python から操作する
https://qiita.com/nishimuraatsushi/items/97f281f206b7df454da3 - デバイスドライバに頼らないハードウェア操作
http://www.mech.tohoku-gakuin.ac.jp/rde/contents/linux/drivers/nodriver.html
どうやら、CPUにはIOポートを直接操作する命令が用意されていて、それを使って指定のアドレスを読み書きするか、メモリマップドの場合は対応するメモリを読み書きすることでPCIのデバイスを操作できるようになる、というもののようだと理解しました。
この後は
この記事が良さそうだったので、再読しようと思います。(以前読んだことが合ったのですが、当時はチンプンカンプンでした。今ならもうちょっと分かるかな?)
- ハイパーバイザの作り方~ちゃんと理解する仮想化技術~ 第15回 PCIパススルーその1「PCIパススルーとIOMMU」
https://syuu1228.github.io/howto_implement_hypervisor/part15.html
ちょっと話はそれますが、上記のURLやRui Ueyamaさんのコンパイラブックのような有料の書籍として出しても十二分に価値があるコンテンツを無料で誰でも読めるようにしてくれているというのはとてもありがたいですね。感謝しかありません。
さらに、有料の書籍であっても、数千円で自力では到底調べきれないであろう知見を共有してくれることは大変ありがたいです。お金出して買っているから、という態度ではなく、知見を共有してくれることに感謝を忘れずにいたいと思います。IT系の書籍でなく小説などでも、やはり書いてくれる方がいるから我々も楽しむことができるわけなので、感謝を忘れずにいようと思います。
2021/03/28追記
上記のURLの他にこのサイトも見て、ちょっと分かってきたかなーという感じです。
- PCIからNICの情報を取得する
http://yuma.ohgami.jp/x86_64-Jisaku-OS-4/01_pci.html
どうやらPCI Configuration Spaceは0x0cf8に、Config Dataは0x0cfcにマップされているらしいです。Configuration Spaceへバス番号、デバイス番号、ファンクション番号を指定して読み書きしたいレジスタをセットして、0x0cfcの値を読み出したり、そこへ値を渡したりすることで読み書きができる、というようですね。
SATAやネットワークカードの場合に、具体的にどのようにデータを読み書きするのかまではたどり着けていない感じですが、一歩進んだ手応えを感じ中です。