首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux DMA详解 (1)

Linux DMA详解 (1)

DMA控制器硬件结构

  

DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。

  

数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。

  

在第一种情况下,调用的步骤可以概括如下(以read为例):

  

1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡眠。

  

2)硬件将数据写入 DMA 缓冲区并在完成时产生一个中断。

  

3)中断处理程序获得输入数据,应答中断,最后唤醒进程,该进程现在可以读取数据了。

  

第二种情形是在 DMA 被异步使用时发生的。以数据采集设备为例:

  

1)硬件发出中断来通知新的数据已经到达。

  

2)中断处理程序分配一个DMA缓冲区。

  

3)外围设备将数据写入缓冲区,然后在完成时发出另一个中断。

  

4)处理程序利用DMA分发新的数据,唤醒任何相关进程。

  

网卡传输也是如此,网卡有一个循环缓冲区(通常叫做 DMA 环形缓冲区)建立在与处理器共享的内存中。每一个输入数据包被放置在环形缓冲区中下一个可用缓冲区,并且发出中断。然后驱动程序将网络数据包传给内核的其它部分处理,并在环形缓冲区中放置一个新的 DMA 缓冲区。

  

驱动程序在初始化时分配DMA缓冲区,并使用它们直到停止运行。

  

DMA控制器依赖于平台硬件,这里只对i3868237 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物理内存里。装入寄存器的地址必须是物理地址,而不是逻辑地址。

继承事业,薪火相传
返回列表