一部のプラットフォームでは、次の C または C++ コードに関する記述を時々目にします。
int* ptr;
*ptr = 0;
ptr
ポートがマップされているアドレスをたまたま格納すると、ハードウェア入出力ポートに書き込む可能性があります。通常、それらは「組み込みプラットフォーム」と呼ばれます。
そのようなプラットフォームの実際の例は何ですか?
一部のプラットフォームでは、次の C または C++ コードに関する記述を時々目にします。
int* ptr;
*ptr = 0;
ptr
ポートがマップされているアドレスをたまたま格納すると、ハードウェア入出力ポートに書き込む可能性があります。通常、それらは「組み込みプラットフォーム」と呼ばれます。
そのようなプラットフォームの実際の例は何ですか?
私の経験では、ほとんどのシステムでメモリ マップド I/O が使用されています。x86 プラットフォームには、独立したメモリ マップされていない I/O アドレス空間 (プロセッサ オペコードのin
/ファミリを使用) がありますが、PC アーキテクチャでは、デバイス I/O 用に標準のメモリ アドレス空間も広く使用されています。out
より大きなアドレス空間、より高速なアクセス (一般的に)、および簡単なプログラミング (一般的に)。
プロセッサのメモリアドレス空間は時々かなり制限されており、その一部をデバイスアクセスに使用することはほとんど意味がなかったので、最初は個別の I/O アドレス空間が使用されたと思います。メモリ アドレス空間がメガバイト以上に開放されると、メモリ アドレスから I/O アドレスを分離する理由は重要ではなくなりました。
x86 のように個別の I/O アドレス空間を提供するプロセッサがいくつあるかはわかりません。独立した I/O アドレス空間がどのように人気を失ったかを示すものとして、x86 アーキテクチャが 32 ビット領域に移行したとき、I/O アドレス空間を 64KB から増やすことは何も行われませんでした (ただし、機能は追加されました)。 1 つの命令で 32 ビットのデータ チャンクを移動する)。x86 が 64 レルムに移行したとき、I/O アドレス空間は 64KB のままで、64 ビット単位でデータを移動する機能さえ追加されませんでした...
また、最新のデスクトップおよびサーバー プラットフォーム (または仮想メモリを使用するその他のシステム) では、メモリ マップされているかどうかにかかわらず、アプリケーションが I/O ポートにアクセスすることは一般的に許可されていないことに注意してください。そのアクセスはデバイス ドライバーに制限されており、デバイス ドライバーでさえ、物理アドレスの仮想メモリ マッピングを処理したり、DMA アクセスを設定したりするための OS インターフェイスを備えています。
組み込みシステムなどの小規模なシステムでは、多くの場合、I/O アドレスはアプリケーションから直接アクセスされます。メモリ マップ アドレスを使用するシステムでは、通常、デバイスの I/O ポートの物理アドレスをポインターに設定し、そのポインターを他のポインターと同様に使用するだけで済みます。ただし、アクセスが確実に正しい順序で行われるようにするには、ポインターをvolatile
オブジェクトを指すものとして宣言する必要があります。
メモリにマップされた I/O ポート以外 (x86 の I/O アドレス空間など) を使用するデバイスにアクセスするために、コンパイラは通常、そのアドレス空間への読み取りまたは書き込みを可能にする拡張機能を提供します。このような拡張機能がない場合は、アセンブリ言語関数を呼び出して I/O を実行する必要があります。
これは Memory-mapped I/O と呼ばれ、 Wikipedia の記事から始めるのが良いでしょう。
最新のオペレーティング システムでは、通常、ドライバーを作成していない限り、これを防ぐことができますが、この手法は PC アーキテクチャにも当てはまります。DOS の 640Kb 制限を覚えていますか? これは、640K から 1Mb までのメモリ アドレスが I/O 用に割り当てられているためです。
メモリ マップド I/O を使用するデバイスの例 (ルーター、ADSL モデム、マイクロコントローラーなど)については、組み込みシステムを参照してください。
プレイステーション。これが、システムの低レベルのグラフィック (およびその他の) 機能への直接的な最適化されたアクセスを得た方法です。
Windowsの NDISドライバーは一例です。これはメモリ マップド I/O と呼ばれ、パフォーマンスが向上します。
ほとんどのペリフェラル デバイスはメモリ マップド レジスタを介してメイン CPU と通信するため、ドライバを記述するときに主に使用されます。
Motorola 68k シリーズと PowerPC が大きなものです。
これは、最新の Windows でも実行できます (Linux でも提供されていると確信しています)。これはメモリ マップド ファイルと呼ばれます。Windows のメモリにファイルをロードし、ポインターを操作するだけでファイルを書き込み/変更できます。