3

システム ライブラリを使用せずに、アセンブリまたは C を使用して I/O デバイスとの間で直接読み書きできる方法を知りたいと思っていました。たとえば、文字データを 0xB8000 に書き込むことで、x86 リアル モードでテキスト ベースの VGA にレンダリングできることを私は知っています。しかし、他の CPU アーキテクチャで他のデバイスにアクセスするにはどうすればよいでしょうか? それらはすべて最初からメモリマップされていますか、それとも必要なときにそれらを取得するためのトリックはありますか?

具体的には、C または ARM asm で、テキスト モード、USB ポート、および ps/2 ポートで vga を読み書きする方法を知りたいです。標準の通信プロトコルについて知る必要はありません。それは自分で理解できます。ポートやその他のデバイスを識別して通信する方法を知りたいだけです。

コンパイラとアセンブラには、ホスト アーキテクチャとして x86_64 で実行されるクロスコンパイルされた GNU ツールチェーンを使用しています。ターゲット マシンにライブラリやオペレーティング システムがないため、実際にはフラット バイナリを作成し、SD カードのブート セクタに書き込むだけです。ハードウェアはラズベリーパイのモデルbです。

4

3 に答える 3

3

実際、VGA についてあなたが言っていることは、部分的にしか正しくありません。リアルモードでは、それは正しいです。歴史の教訓: DOS が 640K のメモリしか提供しなかった理由は、残りのアドレス可能なメモリをデバイス ドライバ用に確保するためでした。これは、Linux カーネルが圧縮されているのと同じ理由です。プロセッサが保護モードに切り替わるまで、その場合、すべてのプロセスに独自の仮想メモリ空​​間があります。デバイス ドライバーは (基本的に) あるレベルで、ドライバーへの呼び出しをデバイスのハードウェア バッファーへの実際のデータの取得と書き込みに変換することによって機能します。

tl;dr。あなたが求めているのは、あなたが書いているハードウェアとOSに固有のものです。申し訳ありませんが、これ以上具体的に言えません。

于 2013-05-22T20:54:45.853 に答える
1

a) MIPS などのアセンブリ アーキテクチャを選択することから始めることができます。アセンブリをプログラミングしたことがない場合は、x86 よりも簡単な MIPS を選択することをお勧めします。次に b) シリアル ポートを使用してデータを転送する方法を調べることをお勧めします。トレーニングをしている場合、FPGA はこれを学習するための優れた方法です。

ハードウェアに書き込むには、メモリ マップド i/o を使用して特定のメモリ アドレスに書き込みます。ARm がどのようにそれを行うかについてのドキュメントは見つかりませんでしたが、RISC である Nios 2 アセンブリでは、たとえば、値 0x17 をアドレス 0x810 に書き込むと、LED LEDR4、LEDR2、LEDR1、および LEDR0 が点灯し、シリアルポートには、送信データを書き込むことができるメモリ アドレスもあります。

于 2013-05-22T21:14:43.557 に答える