7

アドレス302Hにある値を読みたいと思っています。目的は、ハードウェア(104pcスタックの一部)からの入力を読み取ることです。次のコードを実行すると、このエラーが発生します。Unhandled exception at 0x004134b9 in setOutput.exe: 0xC0000005: Access violation reading location 0x00000302.

#include <stdlib.h> 

#define PORTBASE 0x302
int _tmain(int argc, char *argv[])
{
    int value;
    int volatile * port = (int *) PORTBASE;
    printf("port = %d\n", port);
    value = *port;
    printf("port value = %d\n", value);
}

編集:

私はこれを未亡人xpの下で実行しています。ボード上で見つけることができるドキュメントのみが以下にありますここに画像の説明を入力してください

編集:

以下の回答から、ボードのドライバーを作成する必要があることがわかります。誰かがそうする方法についてのリソースを私に指摘できますか?

4

5 に答える 5

11

Windowsで直接物理メモリにアクセスするには、ドライバを開発する必要があります。理由を確認するには、仮想アドレス空間を確認することをお勧めします。簡単な説明:ユーザーモードプロセスから表示されるメモリアドレスは、物理メモリアドレスとは関係がなく、ハードウェアが存在するアドレスは、ユーザーモードアプリケーションが混乱するのを防ぐためにOSによって保護されています。

于 2011-03-01T17:46:13.460 に答える
1

もちろん、完全にやりたい場合は、Windows DeviceDriverSDKをダウンロードできます。

于 2011-03-01T19:20:51.030 に答える
1

プログラムは通常のユーザーとして実行されていると思います。OSの損傷やシステムのクラッシュを防ぐために、最新のOSとCPUは、プログラムに属していないメモリにアクセスできないようにします。

このようなデバイスメモリにアクセスするには、ユーザーモードではなくカーネルCPUモードで実行する必要があります。このようなデバイスを使用する通常の方法は、カーネルモードで実行される低レベルのデバイスドライバーを作成し、それをユーザーモードプログラムへのインターフェイスとして使用することです。

于 2011-03-01T17:48:44.987 に答える
1

ユーザーモードプログラムからハードウェアに直接アクセスすることは許可されていません。そのためのデバイスドライバーが必要です。

ハードウェアには、インストールする必要のあるソフトウェアが付属していませんか?呼び出し方法については、ソフトウェアのドキュメントを確認してください。

于 2011-03-01T17:49:30.963 に答える
1

ユーザーモードアプリケーションがIOポートを読み書きできるようにするための既製のドライバーがいくつかあります。最も有名なものの1つはinpout32.dllであり、他はここで言及されています。それらを見つけるための適切な検索キーは「パラレルポートNTの書き込み」です(これらはこのタスクで最も頻繁に使用されるため)。

一般に、これらはカーネルモードドライバー(管理者権限を必要とするアクション)をロードし、dll関数を呼び出して読み取り/書き込みを実行するたびにユーザーモードからそれを呼び出すことによって機能します。

ただし、これらのライブラリのほとんどにはアクセス制御の形式がないため、ドライバをロードすることで、IOポートでの読み取り/書き込みに使用する方法を知っているアプリケーションを実際に許可することに注意してください。これは非常にセキュリティです。危険。

于 2011-03-01T18:32:35.013 に答える