【问题标题】:How to read or write an I/O port in arm64?如何在 arm64 中读取或写入 I/O 端口?
【发布时间】:2021-12-31 02:38:47
【问题描述】:

我试图将一个字节写入 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串口。

【问题讨论】:

  • arm 没有 I/O 空间和内存空间。它只有一个地址空间。外围设备映射到该空间,您可以使用芯片供应商定义的地址使用加载和存储指令(顺便说一句,ARM 不是芯片供应商,它们只是芯片供应商的 ip 供应商,就像其他 ip 供应商一样)。跨度>
  • 你用的是什么芯片?

标签: io operating-system arm port arm64


【解决方案1】:

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

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

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

【讨论】:

  • 坏消息,谢谢。我想知道 arm64 的 gdbstub 在执行target remote:1234 时如何工作。 “1234”是一个端口。我想回答自己寻找代码,但我再次找不到 arm64 的存根 :)
  • 拜托,@siguza,您能否加深一下“在所有其他情况下,您将其记忆映射到某个物理地址”这句话?
  • 我以为你在写一个内核模块。 gdb 端口只是标准的 TCP/IP 端口。与任何其他用户态程序一样,gdb 必须使用系统调用,如果它想使用这些调用,则必须遵从内核。
猜你喜欢
  • 2023-03-14
  • 2015-03-16
  • 2010-09-17
  • 2012-05-25
  • 2010-11-05
  • 2013-11-09
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多