Ho un hardware che voglio emulare; Mi chiedo se posso farlo a un livello basso come questo. L'hardware ha molti registri, che organizzo in una struttura:Come emulare l'I/O mappato in memoria
#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;
Quindi, voglio sostenere la seguente sintassi per l'accesso hardware su Windows e Linux:
MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
Quando l'ultima riga di codice viene eseguito, voglio che l'emulatore hardware si "svegli" e faccia qualcosa. Posso implementarlo su Windows e/o Linux? Ho pensato di prendere in qualche modo il segnale di "segmentation fault", ma non sono sicuro se questo può essere fatto su Windows, o del tutto.
Ho guardato la pagina di manuale di mmap
; sembra che possa aiutare, ma non ho potuto capire come posso usarlo.
Ovviamente, potrei astrarre l'accesso all'hardware definendo funzioni come WriteToMyDevice
e tutto sarebbe facile (forse), ma voglio capire se riesco ad organizzare l'accesso al mio hardware in questo modo esatto.
Il tuo "livello basso" è troppo alto ... Sia in Windows che in Linux l'accesso all'hardware avviene dalla modalità kernel. Devi pensare a più dettagli di implementazione - come parlare con l'hardware. Ad esempio, è possibile scrivere l'effettiva emulazione di driver e driver. –
Quindi, utilizzare gli indirizzi di memoria predefiniti in modalità utente è impossibile? – anatolyg
Non è possibile parlare direttamente con il dispositivo hardware dalla modalità utente Windows/Linux utilizzando l'accesso diretto alla memoria. Questo è possibile solo nella modalità kernel. Questo è il motivo per cui ti suggerisco di pensare prima ai dettagli di implementazione. Senza di loro in realtà non sai cosa emulare. –