PCIデバイスについてです
PCIデバイスは起動する時には、マザーボードに接続されていること前提で話をします。
(起動後からPCIスロットに差し込む人はいないと思うので・・・)
1、起動後BIOSがPCIデバイスを検出し、各周辺機器のベースアドレスレジスタの値を設定します。
2、カーネル起動後、バススキャンを行い、PCIデバイスを検出し、コンフィギュレーション空間へアクセス。
(バス番号などはBIOSで取得したにもかかわらず、OSが再度取得)
I/O 空間にある DWORD 幅のレジスタ CONFIG_ADDRESS (0CF8h), CONFIG_DATA (0CFCh) を用いてコンフィグレーションレジスタを読み書きする。CONFIG_ADDRESS にアクセスしたいバス番号、デバイス番号、ファンクション番号、レジスタアドレスを書き込むと CONFIG_DATA がそのレジスタを読み書きする窓になる仕組み。
CONFIG_DATA (0CFCh, DWORD)
こちらは特に DROWD 幅のアクセスでなくても良い。CONFIG_ADDRESS[31] が 1 のとき、CONFIG_ADDRESS で指定された PCI デバイスのコンフィグレーションレジスタの内容を CONFIG_DATA レジスタを経由して読み書きできる。
PCI デバイスは I/O 空間およびメモリ空間にレジスタ群を割り当ててアクセスする。マップするアドレスを設定するのがこの BAR。BAR はコンフィグレーションレジスタ群のうちの一つ。BIOS や UEFI が空いている I/O アドレス範囲やメモリアドレス範囲を探して BAR を設定することになっているので、OS は自分で設定しなおす必要はない。しなおしても良い。
PCI デバイスを使おうと思ったら、そのバス番号とデバイス番号を特定する必要がある。
3、PCI_DEVICEマクロやPCI_DEVICE_CLASSマクロで、コンフィギュレーション空間を元にpci_device_id構造体を作成する。pci_register_driver()を実行しドライバの登録。
4、pci_enable_device()でデバイスの有効化。
(probe関数に入るんですかね?)
5、デバイスドライバは、IO空間を使用してデバイスを制御する。
間違いがあればご指摘ください。(おそらく、3,4あたりが怪しい気がします。)
[不明な点]--------------------------------------------------------------
コンフィグレーション空間のベースアドレスレジスタにセットされるアドレスは、IO空間のアドレスといいうことで良いんですよね?
(ポートマップトIOの場合)
メモリマップトIOの場合は、メインメモリの物理アドレスがセットされる。
64bit CPUでもIO空間は、32bitまでしかないそうです。
なんか・・・少ないような気がしますが・・・
DMAなしのデバイスの場合、IO空間のみを使用してデバイスと通信するんですよね?
DMAありのデバイスの場合、IO空間、メモリ空間の両方を使用して通信。データの送受信はメモリを介すんですよね?
DMAで使用するメインメモリのアドレスもベースアドレスレジスタにセットされるんでしょうか?
(イメージとして、DMAをサポートするデバイスはポートマップトIO, メモリマップトIOのハイブリッドのようなものかな?)
ポートマップトIO + DMAの構成はあると思いますが、メモリマップトIOでもDMAをサポートしているのでしょうか?
(メモリマップトIO + DMAってよくわからないですが・・・)
最近のデバイスのほとんどはDMAをサポートしているんでしょうか?
プローブ関数がわかりません。何を行うための関数でしょうか?
「参考サイト」
リンク内容
リンク内容
リンク内容
リンク内容
リンク内容
リンク内容
リンク内容
リンク内容
リンク内容
リンク内容
リンク内容

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/09 03:12
2017/08/09 04:10
2017/08/09 04:31