最近はx86のお勉強をしようと考えて、uchanさんの「ゼロからのOS自作入門(通称みかんOS本)」を読んでいます。 私はx86のことをほとんど知らないので、armとの違いを感じられて読んでいて楽しいです。
さて、先日6章3節「PCIデバイスの探索」を読み進めていたところ、少し興味深い内容がありました。 その記述内容を引用します。
PCIコンフィグレーション空間を読むには CONFIG_ADDRESS レジスタと CONFIG_DATA レジスタを使います。 それぞれIOアドレス空間の 0x0cf8 と 0x0cfc にある32ビットレジスタです (ゼロからのOS自作入門,pp.142より引用)
「ここで紹介されているレジスタアドレスの出どころ(資料)はどこなんだろう」と気になったのですが、みかんOS本だけでなくいくつかのサイトにも記述が見つからなかったので、詳しく調べてみることにしました。 (調べたサイトたち)
x86初心者なので、もっと良い資料や説明があれば教えていただけると嬉しいです 🙏
調査
「x86 pci 0x0cf8」などで検索していたところ、手がかりになりそうな内容を記載しているページを見つけました。 当該部分を引用します。
CPU I/Oポートの0xCF8(固定)と0xCFC(固定)を使ってPCIデバイスのコンフィギュレーション空間にアクセスし、PCI互換レジスタを設定する(この方法はチップセット実装に依存する)。 (PCI/PCI Express バスについて調べてわかったことなど | DXR165の備忘録 より引用)
チップセットとは何かを調べたところ、チップセット ‐ 通信用語の基礎知識 にわかりやすい説明が書かれていました。
こちらに書かれていた内容を簡単にまとめると、少し前までのx86プロセッサは周辺回路・IOコントローラーをCPUの外のチップ(ノースブリッジ・サウスブリッジ)に任せていたようです。
以下のwikipediaの図もチップセットの役割の理解の助けになりました。
By Original: Gribeco at French Wikipedia Derivative work: Moxfyre at English Wikipedia - This file was derived from: Diagramme carte mère.png Block diagram of a late-2000s motherboard (legend in English). CC BY-SA 3.0
話を戻すと、チップセットまたはCPUの仕様書を探すと CONFIG_ADDRESSレジスタ等のアドレスを見つけられそうです。
そこでチップセットを検索ワードに入れて調べてみたところ、E8500というノースブリッジのデータシートを見つけました。
https://www.intel.co.jp/content/dam/doc/datasheet/e8500-chipset-north-bridge-datasheet.pdf
このデータシート内で検索をかけたところ、探していたCONFIG_ADDRESSが記載されていました。 当該部分を引用します。
The PCI configuration access mechanism enables support of legacy/PCI code that utilizes the PCI mechanism. (省略) The Intel® E8500 chipset has reserved two special I/O locations (0xCF8 / 0xCFC) for direct configuration accesses. (Intel® E8500 Chipset North Bridge (NB), 4.6 I/O Mapped Registers, pp.56より引用)
以上より「CONFIG_ADDRESS の定義は(少なくとも)チップセットのデータシートに書かれている」という結果が一旦得られました。
さらに気になるけど調べられていないこと
チップセット ‐ 通信用語の基礎知識 の内容を読むと、最近のx86プロセッサはチップセットがプロセッサチップ側に吸収されているとのことです。 「つまり最近のx86 CPUのデータシート等を読めば CONFIG_ADDRESS が書かれているのでは?」と考えて軽く調べてみましたが、自分ではCPU側のデータシートに記載されている例を見つけられませんでした。 もしこのあたりの事情をご存じの方がいれば、教えていただけると嬉しいです。