에뮬레이트하려는 일부 하드웨어가 있습니다. 나는 내가 이렇게 낮은 수준에서 그것을 할 수 있는지 궁금해.메모리 매핑 I/O를 에뮬레이트하는 방법
#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에서 액세스 및 리눅스에 대한 다음 구문을 지원하려는 : 하드웨어 내가 구조체에 배치 많은 레지스터가
MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
을하면 코드의 마지막 줄 나는 하드웨어 에뮬레이터가 "깨어나서"몇 가지 일을하기를 원한다. 이 Windows 및/또는 Linux에서 구현할 수 있습니까? 나는 어떻게 든 "segmentation fault"신호를 잡는 것에 대해 생각했지만, 이것이 Windows에서 할 수 있는지 또는 전혀 할 수 있는지 확신하지 못했습니다.
나는 mmap
의 매뉴얼 페이지를 보았다. 그것은 도울 수있는 것처럼 보이지만 어떻게 사용할 수 있는지 이해할 수 없었습니다.
물론, WriteToMyDevice
과 같은 기능을 정의하여 하드웨어에 대한 액세스를 추상화 할 수 있으며, 모든 것이 쉬운 (어쩌면) 것이지만이 정확한 방식으로 내 하드웨어에 대한 액세스를 조정할 수 있는지 알고 싶습니다.
"낮음"이 너무 높습니다 ... Windows 및 Linux 모두 하드웨어 액세스가 커널 모드에서 수행됩니다. 구현 세부 사항, 즉 하드웨어와 대화하는 방법에 대해 생각할 필요가 있습니다. 예를 들어, 실제 드라이버 및 드라이버 에뮬레이션을 작성할 수 있습니다. –
그래서 사용자 모드에서 사전 정의 된 메모리 주소를 사용할 수 없습니까? – anatolyg
직접 메모리 액세스를 사용하는 Windows/Linux 사용자 모드에서 하드웨어 장치와 직접 대화 할 수 없습니다. 이것은 커널 모드에서만 가능합니다. 이것이 구현 세부 사항에 대해 먼저 생각해 보라고 제안하는 이유입니다. 그들 없이는 에뮬레이션 할 대상을 실제로 모릅니다. –