Linux 系统下基于 PCI 控制器(PLX9054)的 DMA 编程
DMA programming with PCI controller (PLX9054) in Linux
operating system
崔涛、刘庆文、胡玥
Cui,Tao. Liu,Qingwen. Hu,Yue.
北京科技大学信息学院计算机系 100083
摘要:DMA 是实现大批量数据快速传输的一
种手段。DMA 的实现是高度依赖操作系统和
硬件的。本文讨论了 DMA 编程在 Linux 系统
下的所遇到的主要问题及解决方法。并通过
实例介绍了基于 PLX9054 芯片的 DMA 实现方
法。
关键词:Linux; PCI; DMA; 驱动程序;
PLX9054;
Abstract: DMA is a way to quickly
transport large amount of data. DMA
communication highly depends on
operating system and certain hardware.
This paper discusses the major problem
and solution of DMA programming in Linux
operating system. At the same time, an
example is given to show how to design
DMA communication with PLX9054-PCI
controller.
Keywords: Linux; PCI; DMA; device
driver; PLX9054;
1.引言
在多媒体应用中,在实现视频数据从设
备到主存的传输时,直接内存访问(DMA ,
Direct Memory Access)方式一直是实现大
批量数据快速传输的首选方式。DMA 方式是
依靠硬件在主存和 I/O 设备之间进行直接的
数据传送的方式,其传送过程无须 CPU 执行
程序来控制干预,能够满足大数据传输的对
速度的要求。DMA 通信高度依赖操作系统和
硬件特性,尤其是在嵌入式环境下,操作系
统、硬件特性和有限的环境资源对 DMA 通信
的实现方式和实现手段有很大的影响。在
DMA 通信的具体实现中所遇到的问题则因此
而有所不同。
本文以一个嵌入式视频处理项目为例,
来分析在 Linux 系统下实现 DMA 编程的主要
问题。在此项目中,视频采集卡采用 PLX9054
芯片做 PCI 总线接口。视频数据由采集卡生
成,缓存于卡上 RAM 存储器中,并通过设备
驱动程序传输到主机内存中。要求编写
Linux 设备驱动程序,利用 PLX9054 芯片的
DMA 功能实现将卡上 RAM 中的数据快速的传
输到系统的内核内存中。在这里,DMA 编程
主要涉及到 PCI 接口、PLX9054 芯片和 Linux
系统。
Linux 内核的发展很快。内核版本不同,
设备驱动程序的结构、所使用的硬件接口和
相关的内核支持函数可能会有很大的区别。
因此在 Linux 系统下做驱动程序,必须确定
内核的版本。本项目所用的 Linux 内核版本
是在 2.4.20。下面所介绍的内容全部以该版
本为基础。
2.PCI 及 PLX9054
PCI 是外围设备互连(Peripheral
Component Interconnect)的简称,它是一
种通用总线接口标准。PCI 提供了一组完整
的总线接口规范、电气特性和行为规约,通
过该规范,计算机系统中的外围设备能够实
现结构化、可控化的连接以及正确地进行交
互。PCI 设备上有三种地址空间:I/O 空间、
存储空间和配置空间。配置空间的信息主要