【问题标题】:Read/Write to Debug Port (0x80h) using C#使用 C# 读取/写入调试端口 (0x80h)
【发布时间】:2021-04-05 23:33:46
【问题描述】:

我正在尝试在 Windows 上编写一个简单的 C# 程序,以在任何受支持的主板(如 herehere)。之前已经在 Linux、C、Assembly 中通过名为“TempLCD”的免费软件完成了这项工作:

C(__outword 命令示例):What does the 0x80 port address connect to?

大会:Is there a way to manually change BIOS POST codes on motherboard LCD?

Linux:Writing LCD Temperatures in Linux to Debug Port

在此屏幕截图中,您可以看到调试端口位于 80(设备管理器 > 查看 > 按类型划分的资源):

如何使用任何高级编程语言(例如 C#)将此端口作为读/写目标? SerialPort 类失败,因为它需要 COM1、COM2 等。

【问题讨论】:

  • 您不能直接从用户模式程序执行此操作 - 您需要内核模式驱动程序。可能有一种通用的可供您使用,但我不知道有一种可以在我的脑海中发挥作用。
  • 通常您的开发板使用 USB 转 USB 电缆连接到另一台 PC。您写入开发板上的 com 端口(Com1 或 Com2),然后在 PC 上的 Com 端口上读取。您不使用 I/O 地址。开发板和 PC 上都有一个驱动程序,将 I/O 地址映射到端口名称(Com1,Com2,...)。
  • TempLCD 使用名为:WinRing0x64 的 DLL 文件和 driver.sys 文件。这可能是需要从第 3 环到第 0 环的跳跃吗?

标签: c# io x86 port motherboard


【解决方案1】:

您只能在 kernel 模式下写入此 I/O 端口。普通用户模式应用程序不支持对这些 I/O 端口的读/写操作。

您甚至可以在the linked question 的解决方案中看到这些都需要内核模式驱动程序。特别是,Windows 解决方案 __outword 只是一个特定于 MSVC 的内在函数,它会导致发出 the x86 OUT instruction,并且正如 Intel x86 文档所说,OUT is a privileged instruction 不允许在 Ring 3 中执行(即运行用户模式应用程序的位置)。

由于无法从用户模式执行,因此根本无法从 .NET 应用程序执行。您不能使用 .NET 编写在 Ring 0 中运行的 Windows 驱动程序。您将需要使用可以生成本机(即非托管)代码的不同编程语言。 C 和 C++ 是典型的选择。

如果您使用 C 或 C++ 等非托管语言编写驱动程序,则可以使用 P/Invoke (DllImport) 机制从 C# 应用程序调用它。请参阅:Accessing Device Drivers from C# 和类似资源。

【讨论】:

  • 从技术上讲,允许或允许/禁止访问用户模式下的端口(环 3)取决于操作系统设计。您可以将用户模式的 IOPL 设置为 3,并且 IN/OUT 指令将执行而不会引发异常。或者,您可以使用 TSS 中的 IO 位图来授予/拒绝单个端口访问,其中 IOPL=0 以授予对特定端口的访问权限。例如,Linux 曾经有 iopl 功能,但仍然有 ioperm
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2017-04-22
  • 2015-07-26
相关资源
最近更新 更多