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。
cma架构
swiotl
iommu
参考
- IOMMU的现状和发展
- Mastering the DMA and IOMMU APIs
- Linux内存管理之CMA
- DMA
- CMA
- CMA模块学习笔记
- Dynamic DMA mapping Guide
- SWIOTLB 软件IOMMU
- Linux内存管理:什么是CMA(contiguous memory allocation)连续内存分配器?可与DMA结合使用
- 没有IOMMU的DMA操作
- Page migration for IOMMU enhanced devices
- DMA -1-(基本)
- The-Flavors-of-Memory-Supported-by-Linux-their-Use
- GUP and ZONE_DEVICE pages
- Minimizing struct page overhead
- DMA CACHE一致性问题解决方案