地址范围连接到设备
设备可以把寄存器或专用存储暴露在系统地址空间中,驱动通过相应地址访问它们。Linux驱动通常先取得资源信息,再借助ioremap等接口得到适合设备访问器使用的映射;物理资源地址不能直接当普通可解引用指针。
映射I/O与端口I/O是不同接口形式:后者可使用独立的端口地址空间和专门指令。设备采用哪种方式、哪些地址和访问宽度有效,要看硬件及平台约定,不能仅凭一段地址就认定它是普通内存。
参考:[1]
访问器承载宽度、字节序与顺序要求
Linux提供readl、writel等设备访问器,以及适用于I/O空间的复制接口。普通memcpy或任意指针读写不保证这些访问按设备需要的方式发生;访问宽度和字节序也要与寄存器定义一致。
有些访问器提供较弱的顺序保证,以降低不必要的屏障开销,但只能在具体协议允许时使用。RISC-V的FENCE还分别描述设备输入、输出与普通内存读、写的顺序域,说明“地址访问”内部仍有不同的观察规则。
写入发出与设备收到不同
某些总线会缓冲并延后提交设备写入,例如PCI的posted write。代码执行过一次写访问,并不在所有情况下代表设备已经收到;Linux文档说明,必要时可通过同一设备的适当读取来满足写入完成要求。
这种完成检查不同于CPU之间共享RAM的同步。MMIO地址的映射属性、设备副作用和总线规则都可能参与结果,不能靠加一个普通变量或笼统的屏障,就代替设备协议规定的确认步骤。