如何从.Net中的内存映射I / O端口读取?

时间:2008-10-16 03:02:51

标签: c# .net memory pointers io

.Net中的标准指针可以这样做吗?或者是否需要诉诸P / invoke?

请注意,我不是在讨论对象引用;我在谈论不安全代码中的实际C#指针。

2 个答案:

答案 0 :(得分:5)

C#作为托管和受保护的运行时引擎,不允许低级硬件访问,并且与实际硬件关联的内存位置不可用。

您需要使用端口驱动程序或使用适当的Windows API在C ++或C中编写自己的端口驱动程序,以访问感兴趣的内存映射I / O区域。这将在比C#程序能够更低的环中运行。

这就是为什么你看不到用C#编写的驱动程序,虽然我知道很多人用C ++编写访问例程,但是C#中的主要驱动程序逻辑。但是,这很棘手,因为崩溃和重启会变得棘手,更不用说同步和时序问题了(即使Windows远离实时系统,在较低的环中C ++也更具体一些)。

- 亚当

答案 1 :(得分:3)

要扩展Adam's answer,您甚至无法在没有内核驱动程序的情况下从Win32应用程序执行内存映射I / O. Win32应用程序获取的所有地址都是与物理地址无关的虚拟地址。

您需要编写一个内核驱动程序来执行您正在谈论的内容,或者安装一个具有API的驱动程序,该API可以让您针对特定的物理地址发出I / O请求(这样的驱动程序将是一个相当大的安全漏洞等待发生,我想。我似乎记得回想起来,当一些装备有这样的驱动程序作为开发工具包的一部分,以帮助将传统的DOS / Win16或任何设备代码移植到Win32。我不记得它的名字或知道它是否还在。