如何在 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
.
与外围设备通信
在所有其他情况下,您将其内存映射到某个物理地址。因此,您可以通过简单的加载和存储来访问它。
我试图将一个字节写入 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
.
在所有其他情况下,您将其内存映射到某个物理地址。因此,您可以通过简单的加载和存储来访问它。