2016-11-03 40 views
4

私はFreescale MPC8308プロセッサ(PowerPCアーキテクチャに基づいています)でPCI-eポートを使用していますが、使用する際にいくつか問題があります。エンドポイントPCI-eデバイスのメモリ容量は256 MBです。私は "pciutils"パッケージを使って、エンドポイントデバイスのコンフィギュレーションスペースを簡単に読み書きできます。mmapを使用したPCI-eメモリ空間アクセス

コンフィギュレーションレジスタに正しい値を書き込み、メモリ空間にアクセスする許可を得た後、私はCで「のmmap()」関数を使用して、メモリ空間をアクセスしようと位置ファイル記述子を使用する:

「/sys/devices/pci0000:00/0000:00:00.0/resource0」

これはちょうど256MB(エンドポイントデバイスのメモリスペースに等しい)だったので、ファイル記述子に正しいパスを使用しているようです。ここでは、https://github.com/billfarrow/pcimemで述べたように「)(MMAP」を使用して私のコードを見つけることができます。

https://github.com/billfarrow/pcimem/blob/master/pcimem.c

しかし残念ながら、私は「のmmap()」関数の戻りアドレスを使用して、メモリ空間を使用するようにしてください。エンドポイントデバイスの読み取り専用レジスタを正しく読み取れません。また、 "0x7FFFFFC"より大きいアドレスを読み込むと、MPC8308が再起動します。 上記の状況を考慮して、PCI-eインターフェイスを初期化するための手順がありませんか? LinuxカーネルイメージやU-Bootコードで何かを変更する必要がありますか? PowerPC PCI-eをmmap()で使用するのに何か別のものはありますか? PCI-eメモリ空間の読み込みに役立つサンプルコードはありますか?

ありがとうございました

+0

エンドポイントのメモリ容量が大きすぎるようです。私のプロセッサ(i.MX6)では、16MBを超えるエンドポイントを持つことはできません。 PCIeのLinuxブートでinitエラーがありますか? PCI-eメモリデバイスとは何ですか?それはFPGAですか? – FabienM

+0

はい、あまりにも私には多すぎるようでしたが、Linuxの起動には何のエラーもなく、/ proc/iomemで見ることができるようにデバイス用に256 MBのメモリを捧げました。エンドポイントデバイスはFPGAではありません。 PCI-eインターフェイスを備えたASICです。 –

+1

別のルートは、デバイスの基本物理アドレスとその限界を見つけて、/ dev/memにマップすることです。 (正直なところ、これがうまくいくかどうかは保証できませんが、私には分かりません。) – ruthafjord

答えて

1

mmap()は、ユーザ空間からPCIeデバイスにアクセスする非常に便利ですが、カジュアルな方法です。

私はmmapの最初の引数として0を渡していることに気付きました。私の場合、x86コンピュータに接続されたFPGAカードの場合は、lspciを呼び出して、pcieスロットのカードの物理アドレスを取得します。次に、その物理アドレスをmmapの最初の引数として使用します。私はあなたがデバイスの設定空間にBARを書いていることを知っていますが、おそらくlspciで二重チェックします。

$ sudo lspci -s 02:00 -v 
02:00.0 Memory controller: Xilinx Corporation Device 8028 
    Subsystem: Xilinx Corporation Device 0007 
    Flags: bus master, fast devsel, latency 0, IRQ 11 
    Memory at f7e00000 (32-bit, non-prefetchable) [size=1M] 
    Capabilities: [80] Power Management version 3 
    Capabilities: [90] MSI: Enable- Count=1/1 Maskable- 64bit+ 
    Capabilities: [c0] Express Endpoint, MSI 00 
    Capabilities: [100] Advanced Error Reporting 
0

前警告:無回答に備えてください。ユーザー空間からこれをやっているようですね。デバイスをユーザ空間にMMAP化することは、一般的な方法ではありません(あなたがアーキテクチャに非常に気を配っていない限り、セキュリティには重大な影響があります)。正直なところ、私はこれが可能であるとは確信していません。私はこれが行われたケースを考えるのに苦労します。通常、デバイスはカーネルでのみ使用されているので、ユーザー空間ではなく、ドライバやカーネルモジュールを書くことをお勧めします。

+1

フィードバックをいただきありがとうございます。 PCI-eを使用しているときに特にアクセスするために導入された共通のソリューションとしてmmap()を使用することができます。たとえば、「Linuxデバイスドライバ」の第15章では、mmap()を使用してPCI-eメモリ空間にアクセスすることができます。しかし私は、この目的のためにカーネルモジュールを書くことがより戦略的な解決策であることに同意します。また、デバイスがカーネルによって認識され、対応するメモリスペース領域がエンドポイントデバイスに使用されている場合には、簡単なmmapの使用法と比べて難題があります。 –

+0

私はあなたが意図しているものが混乱していると思います。 mmap呼び出しを仲介しているデバイスドライバがある場合(その本が奨励しているようですが、いくつかの素早くスキミングされているようです)、それは妥当かもしれませんカードはバウンスバッファを避ける)。 私を緊張させる部分は、デバイスのMMIO領域全体をマッピングすることです(おそらくユーザー空間にデバイスの完全な制御を与え、ユーザーとカーネルの分離点全体を覆すことになります)。 – ruthafjord

関連する問題