计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

Linux下的PCI-Express设备驱动程序的研究与实现(1)(2)

2013-09-22 01:15
导读:图1 PCI-Express高速数据采集卡逻辑图 3.3 DMA循环缓冲区的分配与实现 对于高速数据信号的采集处理,需要在驱动程序的初始化模块中即系统成功加载驱动程

图1 PCI-Express高速数据采集卡逻辑图
3.3 DMA循环缓冲区的分配与实现 对于高速数据信号的采集处理,需要在驱动程序的初始化模块中即系统成功加载驱动程序的过程中申请大量的DMA循环缓冲区,DMA缓冲区申请的大小直接关系着能否实时对高速数据处理的成败。直接内存访问或者叫DMA是实现高速数据快速传输处理的一种重要手段,DMA是一种硬件机制,它允许外围设备和主内存之间直接传输它们的I/O数据,而不需要系统处理器的参与,使用这种机制可以大大提高与设备通信的吞吐量,因为DMA的实现避免了大量的计算开销。 Linux内核把内存分为三个区段:可用于DMA的内存、常规内存以及高端内存。通常的内存分配都发生在常规内存区,但通过设置内存标志也可以请求在其它区段中分配。可用于DMA的内存是指存在于特别地址范围内的内存,外设可以利用这些内存执行DMA访问,进行数据通信传输。因此,DMA缓冲区的分配要求是:物理连续、DMA可以访问、足够大。Linux系统是使用虚拟地址的系统,系统的内存分配函数提供的地址都是虚拟地址,必须经过virt_to_bus函数转换才能得到物理地址。分配内核内存空间的函数有三个: kmalloc 该函数实现小于128KB的内核内存的申请,所申请的空间是物理连续的;__get_free_pages实现最大4MB的内存申请(在Linux 2.6的内核下),以页为单位,一次申请或释放的页面数必须为2的幂,可一次允许申请到的最大页面依赖于体系结构,一般为2的(10或11次幂)页面,所申请的空间物理连续;vmalloc 虽然分配的虚拟地址空间是连续区域,但是在物理上可能是不连续的。此外,Linux内核还提供了一个专门用于PCI设备申请内核内存的函数pci_alloc_ consistent,该函数支持按字节长度申请。通过对内核源代码的分析,该函数是通过__get_free_pages函数实现对内核内存的分配,因此,其一次可能的最大分配空间也是4MB[3]。 从上面的分析可以看出,Linux2.6内核中能够用于分配DMA缓冲区的函数有三个:kmalloc、__get_free_pages和pci_alloc_consistent,而且一次最大可分配的内存为4MB。 因此在高速信号采集处理系统中,必须实现超过4MB的内核内存申请。在本驱动程序的实现中采用了一种类似数组的内存管理机制,用__get_free_pages函数连续申请DMA内存块,然后从这些块地址排序中找到符合要求的连续内存块集,将这些块组成满足驱动程序要求的DMA缓冲区。使用完毕后,再通过这套管理机制释放这些内存块。 在这里需要说明的是,在大多数健全的系统上,申请DMA内存都是位于上面所述的区段,在x86平台上,DMA驱动是RAM的前16M;对于ISA等老的设备,进行DMA操作必须使用DMA内存区段,虽然对于PCI设备,没有这个限制,但是通过查证相关资料和在实际多次实验中总结可得,用以往的方法对PCI设备申请内存最大也只能申请到11M。因此必须对内存申请进行深入的研究和理解后大胆的进行各种尝试,通过研究发现在64位的系统上根据设置不同的内存分配标志位能申请到更大的符合驱动程序需求的DMA内存。所以在本驱动程序中实现了大小为512M的DMA内存申请,最大可申请到1G大小的共2页: 1 [2] 下一页 论文出处(作者):

(科教范文网 fw.nseac.com编辑发布)


土壤墒情网络监测主机的全方位层式安全模型设计及评价
防御DDoS攻击的实时监测模型
上一篇:论基于数据挖掘技术的保险行业决策分析(1) 下一篇:没有了