如何拦截I / O端口访问以实现虚拟化硬件

时间:2012-10-11 04:49:33

标签: c++ assembly hardware simulation

我正在尝试做一些模拟。在实际情况中,x86-based工业PC使用PC / 104连接网络板。网络板被视为I / O设备。在IPC上运行的代码使用IN,OUT等汇编指令来访问I / O端口。我想在我的笔记本电脑上模拟整个事情。

c++上运行的IPC程序可以移植到我的笔记本电脑,因为它们都基于x86架构。但是对于IN / OUT指令,由于没有真正的网络板连接到我的笔记本电脑,我遇到了麻烦。我使用SystemC模拟了网络板的逻辑。 我想知道是否有办法拦截I / O端口访问(IN / OUT)到真实硬件,并让虚拟化硬件的逻辑接管。

感谢您的任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

如果带有IN / OUT指令的代码在用户程序中,您需要了解如何在同一程序中(可能通过信号?)或在内核中拦截和处理这些指令。 IN和OUT是特权指令,默认情况下它们会在用户模式代码中引发异常(#GP),然后内核会处理此异常。对于这种情况,您需要拥有自己的处理程序。在Windows中,这可以使用所谓的结构化异常处理(AKA SEH)来完成。

如果代码已经在内核中,那很棘手,因为那里的IN / OUT不会导致#GP。

难道你不能用调用设备仿真代码来替换用IN和OUT做其他事情的例程吗?你无论如何都要模仿它,没有人关心它是IN / OUT还是别的什么。

请参阅how this can be done with SEH