3

PCIデバイスをシミュレートするユーザースペースプログラムがあります。NVMe標準を使用してPCIデバイスと対話するnvmelinuxデバイスドライバーをダウンロードしました。ユーザースペースプログラムが標準と互換性があることを確認する必要があります。

nvme.c(Linuxデバイスドライバー)には、デバイスが接続されたときに呼び出されるnvme_probe()関数が含まれています。デバイスがないため、プローブ機能をnvme_init()関数に組み込むと思います。

今、私はインターネットでPCIデバイスをエミュレートする方法を理解するためにかなり多くのことを学びました。たとえば、 デバイスに接続せずにPCIドライバーをインストールする、LinuxでPCIデバイスをエミュレートするなど 、入力された構造体pci_devをに戻す方法がわかりません。nvme_probe()の関数呼び出しpci_set_drvdata(pdev, dev);

また、チュートリアルを提案できる場合は、pci_dev構造体にダミーのデバイス構成とユーザースペースプログラム関数ポインターのメモリアドレスを手動で入力して、nvmeドライバーとの相互作用をエミュレートする方法について説明します。

4

1 に答える 1

1

標準のLinuxカーネルでそのようなことを偽造することは不可能だと思います。

module_init()では、特定のデバイスがシステムに存在する場合(id_tableを介して)、カーネルのPCI SUBSYSTEMに操作ハンドラー(別名-関数ポインターを介したコールバック)をロードするように指示しているためです。

そのため、モジュールをインストールするたびに、カーネルのPCI SUBSYTEMは、一致するvid / pidのデバイスがPCIeスロットに接続されるたびに、ドライバーをロードすることを認識します。操作は以下のようになります-

  • この{vid/pid} pciデバイスがmodule_initまたは_initにある場合、カーネルに{my_driver.ko}をロードするように指示します
  • カーネルが認識した後、一致する{vid / pid}デバイスがシステムに接続されると、{my_driver.ko}の.probe関数コールバックが呼び出されます。
  • デバイスを初期化するか(実デバイスの場合)、trueを返すだけで、デバイスを正しく初期化したカーネルに通知できます。このプローブ機能(読み取り/書き込み用)から新しいドライバータイプを登録することもできます。

PCISUBSYTEMが常にドライバーをロードする原因となる魔法のVID/PID番号についてはよくわかりません。

ただし、実際のP​​CIデバイスを使用して実際にPCIドライバーをロードすることはできます。

実際のPCIデバイスに適したドライバを削除するだけです。ドライバーのVIDPIDとしてVIDとPIDを使用します。次に、PCI SUBSYTEMがドライバーをロードします。また、ドライバーをテストして、後でPCIデバイスをシミュレートすることもできます。

お役に立てれば、

よろしく。

于 2012-12-08T18:02:50.807 に答える