DMA
1. 为什么要有DMA?
没有DMA的情况
- 用户进程通过
read()
系统调用,进入内核态; - 由CPU向磁盘发送I/O请求
- 磁盘收到CPU指令后,将数据放到磁盘控制器的缓冲区,然后发起中断
- CPU收到中断,将数据从磁盘控制器的缓冲区拷贝到PageCache(磁盘高速缓存)
- CPU再将数据从PageCache拷贝到用户缓冲区
read()
调用返回
问题:在整个数据传输过程中,CPU一直参与数据搬运的工作,没有办法做其他事情
2. 什么是DMA?
DMA就是“直接内存访问”,也就是在I/O设备和内存的数据传输的时候,数据搬运的工作全部交给DMA控制器,而CPU不参与数据搬运的工作,从而可以做其他事情。
3. DMA怎么工作
- 用户进程通过
read()
向CPU发起I/O请求,进入阻塞状态 - CPU收到I/O请求后,将I/O请求发送给DMA控制器之后,执行其他任务
- DMA接收I/O请求后,向磁盘发送I/O请求
- 磁盘接收到请求后,将数据读到磁盘控制器的缓冲区,当磁盘控制器缓冲区读满后,向DMA发起中断
- DMA收到中断后,将数据从磁盘控制器的缓冲区拷贝到内核缓冲区
- 当DMA读取了足够多的数据,就向CPU发送中断信号
- CPU收到信号后,知道数据已经准备好了,将数据从内核缓冲区拷贝到用户空间,系统调用返回