【发布时间】:2011-12-15 17:46:47
【问题描述】:
我有一些我想模拟的硬件;我想知道我是否可以在这样的低水平上做到这一点。硬件有很多寄存器,我把它们安排在一个结构中:
#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 上进行硬件访问:
MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
当执行最后一行代码时,我希望硬件模拟器“唤醒”并做一些事情。我可以在 Windows 和/或 linux 上实现这个吗?我想过以某种方式捕获“分段错误”信号,但不确定这是否可以在 Windows 上完成,或者根本就没有。
我看了mmap的手册页;好像有帮助,但我不明白如何使用它。
当然,我可以通过定义WriteToMyDevice 之类的函数来抽象对硬件的访问,一切都会很容易(也许),但我想知道我是否可以以这种确切的方式安排对我的硬件的访问。
【问题讨论】:
-
您的“低级别”太高了...在 Windows 和 Linux 中,硬件访问都是从内核模式完成的。你需要考虑更多的实现细节——如何与硬件对话。例如,您可以编写真正的驱动程序和驱动程序仿真。
-
那么,在用户态使用预定义的内存地址是不可能的?
-
您不能使用直接内存访问从用户模式 Windows/Linux 直接与硬件设备通信。这仅在内核模式下是可能的。这就是为什么我建议您首先考虑实现细节。没有它们,您实际上不知道要效仿什么。
-
只有一条评论,mmap() 对您的问题没有帮助。它为您的进程分配一个新的线性地址间隔,并根据需要将其与空闲页框链接。我理解您想要做什么的方式,您希望在用户空间中的一个内存位置将值更改为 1 时发送信号,正如 Alex 指出的那样,我不熟悉任何简单的方法。
-
...在 Linux 中就是这样。对windows不太熟悉。
标签: c hardware-interface memory-mapping