私はエミュレートしたいハードウェアをいくつか持っています。私はこのような低レベルでそれをやり遂げることができるのだろうかと思う。ハードウェアは、私が構造体にアレンジ多くのレジスタ、持っている:メモリマップされたI/Oをエミュレートする方法
MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
コードの最後の行を:だから
#include <stdint.h>
struct MyControlStruct
{
uint32_t data_reg_1;
uint32_t data_reg_2;
uint32_t dummy[2]; // to make the following registers have certain addresses
uint32_t control_reg_1;
uint32_t control_reg_2;
};
volatile struct MyControlStruct* MyDevice = (struct MyControlStruct*)0xDeadF00;
を、私は、WindowsおよびLinux上のハードウェアにアクセスするための次の構文をサポートしたいですハードウェアエミュレータが "起きて"何かをやりたいと思っています。 WindowsやLinuxでこれを実装できますか?私は何とか "セグメンテーションフォールト"シグナルをキャッチすることを考えましたが、これがWindows上で実行できるか、まったく実行できないかはわかりません。
マニュアルページmmap
を見ました。それは助けることができるようだが、私はそれをどのように使うことができるのか理解できませんでした。
もちろん、私はWriteToMyDevice
のような関数を定義することでハードウェアへのアクセスを抽象化することができますが、すべてが簡単です(おそらく)、私はこの正確な方法で私のハードウェアへのアクセスを手配することができます。
"低レベル"が高すぎます... WindowsとLinuxの両方でハードウェアアクセスはカーネルモードから実行されます。ハードウェアとの対話の仕方、実装の詳細について考える必要があります。たとえば、実際のドライバとドライバエミュレーションを書き込むことができます。 –
したがって、ユーザモードで事前に定義されたメモリアドレスを使用することは不可能ですか? – anatolyg
直接メモリアクセスを使用してWindows/Linuxのユーザモードからハードウェアデバイスと直接通信することはできません。これはカーネルモードでのみ可能です。このため、実装の詳細について最初に考えることをお勧めします。それらがなければ、あなたは実際に何をエミュレートするかを知らない。 –