Tengo hardware que quiero emular; Me pregunto si puedo hacerlo a un nivel bajo como este. El hardware tiene muchos registros, que yo arregle en una estructura:Cómo emular E/S mapeadas en 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;
Por lo tanto, quiero apoyar la siguiente sintaxis para el acceso al hardware en Windows y Linux:
MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
Cuando la última línea de código se ejecuta, quiero que el emulador de hardware se "despierte" y haga algunas cosas. ¿Puedo implementar esto en Windows y/o Linux? Pensé en detectar de alguna manera la señal de "falla de segmentación", pero no estoy seguro de si esto puede hacerse en Windows, o en absoluto.
Miré la página de manual de mmap
; parece que puede ayudar, pero no pude entender cómo puedo usarlo.
Por supuesto, podría resumir el acceso al hardware definiendo funciones como WriteToMyDevice
, y todo sería fácil (tal vez), pero quiero entender si puedo organizar el acceso a mi hardware de esta manera exacta.
Su "nivel bajo" es demasiado alto ... Tanto en Windows como en Linux, el acceso al hardware se realiza desde el modo kernel. Debe pensar en más detalles de implementación: cómo hablar con el hardware. Por ejemplo, puede escribir emulación real de controlador y controlador. –
Entonces, ¿es imposible usar direcciones de memoria predefinidas en el modo de usuario? – anatolyg
No se puede hablar directamente con el dispositivo de hardware desde el modo de usuario Windows/Linux utilizando el acceso directo a la memoria. Esto es posible solo en el modo kernel. Es por eso que le sugiero que piense primero sobre los detalles de implementación. Sin ellos, en realidad no sabes qué emular. –