/dev/mem
によってメモリPCIデバイスと通信する必要があります。どうして?私の上司が私にそう言った理由の一つは、多くの理由があります。は/ dev/memを介してPCIデバイスと通信します
私の回答はhereだと思います。私が理解できないのは答えのMMIO_ADDR
です。特定のメモリ領域と通信したい場合、BAR
レジスタに格納されている値をMMIO_ADDR
として使用しますか?いいえの場合、PCIデバイスとどのように通信しますか?
/dev/mem
によってメモリPCIデバイスと通信する必要があります。どうして?私の上司が私にそう言った理由の一つは、多くの理由があります。は/ dev/memを介してPCIデバイスと通信します
私の回答はhereだと思います。私が理解できないのは答えのMMIO_ADDR
です。特定のメモリ領域と通信したい場合、BAR
レジスタに格納されている値をMMIO_ADDR
として使用しますか?いいえの場合、PCIデバイスとどのように通信しますか?
BARには、BIOS /カーネルによってアドレスが割り当てられています。そのアドレスは、システムが起動するまでに、PCI構成ヘッダーのBARアドレス・レジスターに書き込まれているはずです。たとえば、次のように
は、私がここに持っているVM上で、E1000装置(lspci -v
から)です:
02:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
Subsystem: VMware PRO/1000 MT Single Port Adapter
Physical Slot: 35
Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 17
=> Memory at fd560000 (64-bit, non-prefetchable) [size=128K]
Memory at fdfd0000 (64-bit, non-prefetchable) [size=64K]
I/O ports at 2080 [size=64]
[virtual] Expansion ROM at fd520000 [disabled] [size=64K]
Capabilities: <access denied>
Kernel driver in use: e1000
あなたはその情報を読み取るために必要があります(あなたは/proc/bus/pci/<Bus>/<DevFn>
経由でバイナリ形式でそれを達することができますまたは/sys/bus/pci/devices/
を介して)MMIOアドレスを見つける。
例えば、ショー上記デバイスのためのPCIコンフィグレーション空間のバイナリをダンプ:
od -tx1z -Ax /proc/bus/pci/02/03.0
000000 86 80 0f 10 17 01 30 02 01 00 00 02 10 00 00 00 >......0.........<
000010 04 00 56 fd 00 00 00 00 04 00 fd fd 00 00 00 00 >..V.............<
000020 81 20 00 00 00 00 00 00 00 00 00 00 ad 15 50 07 >. ............P.<
000030 00 00 00 00 dc 00 00 00 00 00 00 00 0b 01 ff 00 >................<
000040
最初のバーは(バー領域#0)であるが第2(バー領域#2)、0x10のオフセットオフセット0x18にあります。
レイアウトと解釈の説明については、https://en.wikipedia.org/wiki/PCI_configuration_spaceを参照してください。
私はBAR値を抽出する方法があります。しかし、私の質問はまだ立っている、BAR値は 'MMIO_ADDR'のために使用する必要がありますか? – flashburn
私はあなたの応答に誤りがあると思います。 2番目のバーは0x14 – flashburn
でなければなりません。もう1つは 'lspci'で表示されます。 –