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

时间:2019-06-26 07:50:30

标签: assembly io gpio kernel-mode

我无法进入Nuvoton NCT6793D的扩展功能模式。数据表中说两次将87h写到注册人2Eh中,但是在尝试这样做时,Visual Studio抛出了一个异常,即第三行是“特权指令”。

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

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

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

预先感谢您的亲切答复。

1 个答案:

答案 0 :(得分:2)

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

有一条指令可以跳转到特权模式(实际上不止一个),但是您当然可以跳转到内核中的入口点。
从根本上讲,所有这些指令都是对特定例程的调用,您无法提升代码,否则操作系统将被完全破坏。

我假设Windows某种程度上涉及到,因为您使用的是Visual Studio和x86代码,尽管标题是指嵌入式计算机。

Windows并没有向用户模式应用程序公开读写IO端口的功能(出于充分的理由)。

未经测试(也许经过测试,但我不记得了)

我发现了一个old driver I wrote for reading IO ports,它暴露了可以像往常一样打开,读取和写入的“文件” \Device\iomem_ioCreateFileReadFile,{{ 1}})。
读取和写入偏移量 WriteFile(请参阅X)将对端口SetFilePointer进行读/写操作,操作的大小必须为1、2或4个字节。

RWEverything附带with a driver,可用来读取/写入端口(以及更多)。它是需要硬件访问权限的恶意软件常用的一种,没有文档记录,它是带有IOCTLs (DeviceIoControl)代码的控制器,必须从逆向工程中收集这些代码。

注意:如果您切换到Linux,则可以使用X允许用户模式程序访问IO端口。这对于调试非常有用。