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

3
标准指针在.Net中能做到这一点吗?还是需要使用P/invoke?请注意,我不是在谈论对象引用;我在谈论的是在不安全代码中实际使用的C#指针。
2个回答

5
作为一种受管理和保护的运行时引擎,C# 不允许低级硬件访问,并且与实际硬件相关的内存位置不可用。
您需要使用端口驱动程序或使用正确的 Windows API 以 C++ 或 C 编写自己的驱动程序来访问感兴趣的内存映射 I/O 区域。这将在比 C# 程序能够运行的更低的环中运行。
这就是为什么您不会看到使用 C# 编写的驱动程序,尽管我了解许多人正在使用 C++ 编写访问例程,但主要的驱动程序逻辑是使用 C# 编写的。然而这很棘手,因为崩溃和重启可能变得棘手,更不用说同步和时间问题了(尽管在较低环中使用 C++ 时这些问题有点更具体,即使 Windows 远非实时系统)。
-Adam

更不用说PInvoke的高开销了。 - Rick Minerich

3

Adam's answer的基础上,即使是Win32应用程序,没有内核驱动程序的合作,也无法执行内存映射I/O。Win32应用程序获得的所有地址都是虚拟地址,与物理地址无关。

要实现您所说的操作,您需要编写一个内核驱动程序,或安装一个具有API的驱动程序,该API将允许您针对特定物理地址发出I/O请求(这样的驱动程序可能会成为一个相当大的安全漏洞)。我记得很久以前,一些公司在开发工具包中提供了这样的驱动程序,以帮助移植传统的DOS / Win16或其他设备代码到Win32。我不记得它的名字,也不知道它是否还存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接