2012-12-03 6 views
5

256バイトのTLPペイロードサイズが必要なPCIeボードを使用しています。私はそれをサポートするCPU(Core i7-3930K)とIntelマザーボード、BIOSにTLPペイロードサイズ設定を提供しないDX79SRを持っています。 デフォルトでは128バイトの最大TLPペイロードがあり、BIOSなしで256バイトに変更する必要があります。 Windowsでこの値を表示するPCIUtilsソフトウェアが見つかりましたが、多目的ポータブルソフトウェアであり、必要なものを見つけるのは複雑すぎます。WindowsのインテルCPU I/Oレジスタに簡単にアクセスする方法

インテル資料describe what values CPU I/Oレジスタに設定する必要があり、I/O位置がC8FhとCFChであることを示すanother documentがあります。

これは私が立ち往生している場所です。これらのレジスタを設定する場合、どこから開始するのかわかりません。 私は経験豊富なWindows S/W開発者ですが、ドライバーは一度も扱っていません。このPCIeボードのドライバのソースコードは変更、ビルド、実行が可能ですが、インテルCPUのI/Oレジスタにデータを書き込む方法はわかりません。私は_outp()関数は、ユーザーモードでは動作しませんが見つかりました。

実行可能(より簡単)またはドライバのどちらから起動するかを教えてください。私が必要とするのは、間違っていなければ、I/OポートC8FhとCFChから読み書きすることだけです。 Windows XP 32ビット版、Win7 x64版、Visual Studio 2010 C++版、WDK版です。

答えて

2

基本的には、outそれぞれin x86 asm命令を使用する必要があります。保護されたモードでは、これらの2つの命令はロックされているため、ユーザーランドモードでは使用できません。

ベストプラクティスは、WDK(Windowsドライバキット)を入手してサンプルを見ることです(これにはソフトウェアドライバが必要です)。 PCIボード用のドライバがカーネルモードドライバの場合は、DriverEntry関数で呼び出しを追加して終了するだけで済みます。

これはオプションではない場合は、独自のソフトウェアカーネルモードドライバを構築する必要があります。hereは、簡単なコード例です。カーネルモードでいくつかの命令を実行したいだけなので、実際のコードは自明です。

+0

ありがとうございました。私はWDKを持っていますし、このボード用のドライバをコンパイルできます。 私はドライバのエントリを確かに見ることができますが、ドライバがカーネルモードまたはユーザモードで動作しているかどうかはわかりません。私はドライバーになじみがない。 ドライバの主な機能ではドライバのロード時に呼び出され、私は_inp()を試してビットを設定してから_outp(0xC8F.mydata)と言うのですが、ここで0xC8FはIntelのドキュメントの場所ですか? – user1871691

+0

@ user1871691かなり大丈夫です。あなたのコードに 'DriverEntry'メソッドがある場合、それはKMDFを使用しています。このメソッドは、ユーザーモードのドライバafaik(これは決して使用されません)とは違って呼び出されます。かなり簡単にコードを更新する必要があります。 – Voo

+0

ありがとうございました。それはうまくいった。私はDriverEntryにそのような4行を入れました:_outpd(0xCF8、0x80000098); 2つのデバイス用にレジスタを設定しなければならないという唯一のトリックでした。私のPCIeスロットはアドレスを持っています。バス:0デバイス:1機能:0、しかし私はまたバスのためのTLPサイズを設定しなければなりませんでした:0デバイス:0機能:0(いくつかの汎用デバイス、私は推測します) – user1871691

関連する問題