linux device memory

CPU如何访问设备的内存或者寄存器?

一般有以下几种方式:

  • pio,port io,和指令集有关系
  • mmio,通过ioremap把设备的寄存器或者内存映射到cpu的地址空间中,对这些地址的read和write就相当于操作设备的寄存器了

设备如何访问CPU的内存?

设备访问CPU的内存,考虑的事情就比较复杂了,需要考虑设备和cpu、设备和设备之前的同步等问题了。

设备访问cpu的内存一般有以下几种方式,基本上都被linux kernel的DMA api所覆盖:

  • 直接访问(dma direct):设备可以访问的地址和cpu的地址空间刚好重合。
    当需要大量连续内存的时候,有两种解决方案:

    • static reserved memory: 系统启动的时候,预留一片内存专门给设备
    • cma:也划分区一片内存给设备使用,有全局的和针对每个设备的,但是和第一个方案不同的是,设备不使用这片内存的时候,系统可以使用。
  • 如果地址不重合,则可以借助于iommu,做一个映射

  • 如果没有iommu,则需要软件来做映射了,比如通过swiotlb,会在设备无法访问的地址和设备可以访问的地址间做个映射,这个buffer叫bounce buffer。

device访问ddr

device访问ddr

device访问ddr

cma架构

cma arch

swiotl

swiotlb arch

iommu

iommu arch

参考

知道是不会有人点的,但万一有人呢:)