DMA控制器依赖于平台硬件,这里只对i386的8237 DMA控制器做简单的说明,它有两个控制器,8个通道,具体说明如下:
控制器1: 通道0-3,字节操作, 端口为 00-1F
控制器2: 通道 4-7, 字操作, 端口咪 C0-DF
- 所有寄存器是8 bit,与传输大小无关。
- 通道 4 被用来将控制器1与控制器2级联起来。
- 通道 0-3 是字节操作,地址/计数都是字节的。
- 通道 5-7 是字操作,地址/计数都是以字为单位的。
- 传输器对于(0-3通道)必须不超过64K的物理边界,对于5-7必须不超过128K边界。
- 对于5-7通道page registers 不用数据 bit 0, 代表128K页
- 对于0-3通道page registers 使用 bit 0, 表示 64K页
DMA 传输器限制在低于16M物理内存里。装入寄存器的地址必须是物理地址,而不是逻辑地址。
对于0-3通道来说地址对寄存器的映射如下:
A23 ... A16 A15 ... A8 A7 ... A0 (物理地址)
| ... | | ... | | ... |
| ... | | ... | | ... |
| ... | | ... | | ... |
P7 ... P0 A7 ... A0 A7 ... A0
| Page | Addr MSB | Addr LSB | (DMA 地址寄存器)
对于5-7通道来说地址对寄存器的映射如下:
A23 ... A17 A16 A15 ... A9 A8 A7 ... A1 A0 (物理地址)
| ... | \ \ ... \ \ \ ... \ \
| ... | \ \ ... \ \ \ ... \ (没用)
| ... | \ \ ... \ \ \ ... \
P7 ... P1 (0) A7 A6 ... A0 A7 A6 ... A0
| Page | Addr MSB | Addr LSB | (DMA 地址寄存器)
通道 5-7 传输以字为单位, 地址和计数都必须是以字对齐的。
在include/asm/dma.h中有i386平台的8237 DMA控制器的各处寄存器的地址及寄存器的定义,这里只对控制寄存器加以说明:
DMA Channel Control/Status Register (DCSRX)
第31位 表明是否开始
第30位选定Descriptor和Non-Descriptor模式
第29位 判断有无中断
第8位 请求处理 (Request Pending)
第3位 Channel是否运行
第2位 当前数据交换是否完成
第1位是否由Descriptor产生中断
第0位 是否由总线错误引起中断
来源:https://www.cnblogs.com/xiaofengwei/p/3795902.html