如何在 arm64 中读取或写入 I/O 端口?

How to read or write an I/O port in arm64?

我试图将一个字节写入 I/O 端口,但我无法在 arm64 aarch64 架构的指令集中找到正确的指令。

要在 i386 中做同样的事情,我会做类似的事情:

void dbg_io_write_8(uint16_t port, uint8_t val)
{
    asm volatile (
        "outb    %%al, %%dx;"
        /* Outputs  */ : /* None */
        /* Inputs   */ : "a" (val), "d" (port)
        /* Clobbers */ : /* None */
        );
}

并且,对于阅读:

uint8_t dbg_io_read_8(uint16_t port)
{
    uint8_t val;

    asm volatile (
        "inb     %%dx, %%al;"
        /* Outputs  */ : "=a" (val)
        /* Inputs   */ : "d" (port)
        /* Clobbers */ : /* None */
        );

    return val;
}

此代码指的是NS16550串口。

arm64 没有 I/O 端口的概念。

如果您既是 CPU 供应商又是 SoC 设计人员,并且有很好的理由,您可能会选择将外围设备映射到(一组)自定义系统寄存器。在那种情况下,您将通过 mrs/msr.

与外围设备通信

在所有其他情况下,您将其内存映射到某个物理地址。因此,您可以通过简单的加载和存储来访问它。