访问嵌入式机器上的 IO 端口 运行 Windows

Accessing IO ports on embedded machine running Windows

我无法进入 Nuvoton NCT6793D 的扩展功能模式。数据表说要将 87h 写入寄存器 2Eh 两次,但在尝试这样做时,我得到 Visual Studio 抛出的异常,即第 3 行是 'privileged instruction'。

在网上查了一下,我的理解是这条指令只能在内核模式下执行,但是我找不到任何方法来运行我在内核模式下的汇编代码。

  .386
  .stack 4096
.
.
.
  main PROC
        mov DX,2EH
        mov AL,87H
        out DX,AL    <----
        out DX,AL
.
.
.

我唯一的选择是编写内核模式驱动程序吗?

提前感谢您的热心回复。

是的,out是特权指令。它必须在 Ring 0(内核模式)执行。
解决这个问题的唯一方法是制作 driver,Windows 具有用于开发 driver 的 Windows Driver Kit(它具有所有工具和许多示例)。

有一条跳转到特权模式的指令(实际上不止一条),当然你跳转到了内核中的一个入口点。
所有这些指令基本上都是对特定例程的调用,您不能提升代码,否则 OS 将完全被破坏。

我假设 Windows 以某种方式参与,因为您使用的是 Visual Studio 和 x86 代码,尽管标题指的是嵌入式机器。

Windows 不会向 read/write 用户模式应用程序的 IO 端口公开函数(有充分的理由)。

未测试(或者可能测试过但我不记得了)

我找到了一个 old driver I wrote for reading IO ports,它公开了可以像往常一样打开、读取和写入的“文件”\Device\iomem_ioCreateFileReadFileWriteFile).
读写at offsetX(见SetFilePointer)将read/writefrom/to端口X,大小操作必须是 1、2 或 4 个字节。

RWEEverything comes with a driver that allows to read/write ports (and much more). It's commonly used by malwares that requires HW access, it is not documented and it is controller with IOCTLs (DeviceIoControl) 必须从逆向工程中收集的代码。

注意如果你切换到Linux,你可以使用iopl允许用户模式程序访问IO端口。这非常适合调试。