0%

DMA

DMA

1. 为什么要有DMA?

没有DMA的情况

  1. 用户进程通过read()系统调用,进入内核态;
  2. 由CPU向磁盘发送I/O请求
  3. 磁盘收到CPU指令后,将数据放到磁盘控制器的缓冲区,然后发起中断
  4. CPU收到中断,将数据从磁盘控制器的缓冲区拷贝到PageCache(磁盘高速缓存)
  5. CPU再将数据从PageCache拷贝到用户缓冲区
  6. read()调用返回

问题:在整个数据传输过程中,CPU一直参与数据搬运的工作,没有办法做其他事情

2. 什么是DMA?

DMA就是“直接内存访问”,也就是在I/O设备和内存的数据传输的时候,数据搬运的工作全部交给DMA控制器,而CPU不参与数据搬运的工作,从而可以做其他事情。

3. DMA怎么工作

  1. 用户进程通过read()向CPU发起I/O请求,进入阻塞状态
  2. CPU收到I/O请求后,将I/O请求发送给DMA控制器之后,执行其他任务
  3. DMA接收I/O请求后,向磁盘发送I/O请求
  4. 磁盘接收到请求后,将数据读到磁盘控制器的缓冲区,当磁盘控制器缓冲区读满后,向DMA发起中断
  5. DMA收到中断后,将数据从磁盘控制器的缓冲区拷贝到内核缓冲区
  6. 当DMA读取了足够多的数据,就向CPU发送中断信号
  7. CPU收到信号后,知道数据已经准备好了,将数据从内核缓冲区拷贝到用户空间,系统调用返回