mwr包(memory write),包中的地址信息是pc的物理地址,数据将写入该地址;
mrd包(memory read),pc在收到后会回复一个完成包,包含读取地址的数据;
scatter-gather dma通过链表式描述符实现非连续内存的高效传输;
每个描述符包含:
数据块的物理地址;
数据块的传输长度;
是否为链表的最后一项;
下一个描述符的物理地址;
工作过程:
板卡按照链表中的描述符顺序执行dma传输;
当传输到最后一个描述符时,通过中断或查询方式通知传输结束;
解决大块内存分配问题:
在pc上很难直接申请连续的大块物理内存;
通过页表机制,将多个非连续的内存页组合成一个逻辑连续的大内存区域;
将这些页表的信息组织成描述符链表,启动dma后,设备可以按照链表一次填充数据;
描述符是一个结构体,里面包含了不同的字段,比如物理地址:dma传输的数据块的起始地址;传输长度:本次dma传输的数据长度;下一个描述符的地址:指向下一个描述符的地址;状态信息:是否是链表中的最后一个描述符,或是否存在其他标志位(如stick bit);
描述符在内存中以链表的形式排列,设备在传输数据时,逐个读取并执行描述符中的操作;
设备能够通过硬件自动读取链表中的下一个描述符地址,dma控制器有一个状态机(硬件模块),他会在完成当前描述符后,自动读取链表中的下一个描述符,在启动dma之前,驱动程序将链表受地址写入设备的某个寄存器,作为dma的起始点;