ana*_*lyg 7 c hardware-interface memory-mapping
我有一些我想模仿的硬件; 我想知道我是否可以在这样的低水平做到这一点.硬件有很多寄存器,我在一个结构中排列:
#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;
Run Code Online (Sandbox Code Playgroud)
所以,我想在Windows和Linux上支持以下硬件访问语法:
MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
Run Code Online (Sandbox Code Playgroud)
当最后一行代码执行时,我希望硬件模拟器"唤醒"并做一些事情.我可以在Windows和/或Linux上实现这个吗?我想过以某种方式捕获"分段故障"信号,但不确定这是否可以在Windows上完成,或者根本不能.
我查看了手册页mmap; 它似乎可以帮助,但我无法理解我如何使用它.
当然,我可以通过定义类似的函数来抽象对硬件的访问WriteToMyDevice,并且一切都很简单(也许),但我想了解我是否可以以这种方式安排访问我的硬件.
原则上,您可以编写(不可移植)一个处理程序,SIGSEGV该处理程序将捕获和处理对不需要的页面的访问,并且可以检查是否访问了指定的地址。
要在 Linux 下执行此操作,您需要使用sigaction系统调用SA_SIGINFO并使用ucontext_t*信号处理程序的第三个参数。
这是极其不可移植的:您必须为不同的 Unix 系统(甚至可能 Linux 内核的版本号也很重要)以及更换处理器时编写不同的代码。
我听说 Linux 内核在这种处理上不是很快。
其他更好的内核(Hurd、Plan9)提供用户级分页,这应该会有所帮助。