深入理解DMA:原理、操作与不同架构支持
1. DMA数据处理流程
DMA(直接内存访问)是一种高效的数据传输方式,其数据处理流程通常如下:
1. 硬件发出中断,通知新数据已到达。
2. 中断处理程序分配一个缓冲区,并告知硬件将数据传输到该缓冲区的位置。
3. 外围设备将数据写入缓冲区,完成后发出另一个中断。
4. 处理程序分发新数据,唤醒相关进程,并进行清理工作。
网络卡常采用异步方式的变体,它们通常期望在与处理器共享的内存中建立一个循环缓冲区(通常称为DMA环形缓冲区)。每个传入的数据包被放置在环中的下一个可用缓冲区中,并发出中断信号。然后驱动程序将网络数据包传递给内核的其他部分,并在环中放置一个新的DMA缓冲区。
高效的DMA处理依赖于中断报告。虽然可以使用轮询驱动程序实现DMA,但这没有意义,因为轮询驱动程序会浪费DMA相对于处理器驱动的I/O所提供的性能优势。
2. DMA缓冲区分配
为了利用直接内存访问,设备驱动程序必须能够分配一个或多个适合DMA的特殊缓冲区。许多驱动程序在初始化时分配缓冲区,并一直使用到关闭。
当DMA缓冲区大于一页时,它必须在物理内存中占用连续的页面,因为设备使用ISA或PCI系统总线传输数据,这两种总线都携带物理地址。不过,SBus使用虚拟地址,一些架构也可以在PCI总线上使用虚拟地址,但便携式驱动程序不能依赖这种能力。
DMA缓冲区可以在系统启动时或运行时分配,但模块只能在运行时分配。驱动程序编写者在为DMA操作分配内存时必须小心,并非所有内存区域都适合。特别是,大多数系统上的高端内存不能用于DMA,因为外围设备无法处理
超级会员免费看
订阅专栏 解锁全文
504

被折叠的 条评论
为什么被折叠?



