欢迎来到天天文库
浏览记录
ID:25541734
大小:53.50 KB
页数:4页
时间:2018-11-20
《linux下基于对象的内存映射型设备驱动研究及实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Linux下基于对象的内存映射型设备驱动研究及实现 摘要:设备驱动是计算机系统可靠运行的前提.现有的设备驱动方法,数据要经过驱动层缓存向应用层拷贝、应用层缓存向存储设备拷贝的过程,当数据量比较大时,系统的响应速度会受到一定的限制.通过对Linux内核的对象机制和虚拟内存机制的研究,提出基于对象的内存映射型设备驱动方法,使用户进程直接访问设备内存以提高响应速度,并对该驱动的性能进行测试和评价. 关键词:设备驱动;内存映射;虚拟内存;基于对象 中图分类号:TP311 2.2虚拟地址空间结构及虚拟内存区域建立 虚拟内存在用户进程空间由structmm_struct结
2、构体来描述.每个进程只有1个mm_struct结构,在每个进程的进程控制块task_struct结构中,有1个指针指向该进程的mm_struct结构.可以说,mm_struct数据结构是进程整个用户空间的抽象,也是总的控制结构.1个进程只使用1个mm_struct结构,但1个mm_struct结构却可能被多个进程所共享.mm_struct描述的是该进程的整个虚拟内存,而整个虚存由多个虚拟内存区域组成,每个区域用vm_area_struct结构体来表示,该结构部分代码为: structvm_area_struct { structmm_struct*vm_mm;//所在
3、的地址空间 unsignedlongvm_start;//虚拟区域开始地址 unsignedlongvm_end;//虚拟区域结束地址 structvm_area_struct*vm_next; pgprot_tvm_page_prot;//访问权限 unsignedlongvm_flags;//标志 structvm_operations_struct*vm_ops;//操作VMA的函数集指针 void*vm_private_data; }; 用于进程虚拟内存管理的各个数据结构之间的关系如图2所示. 要在用户空间能够直
4、接访问设备的内存,首先得建立起设备内存和用户虚拟区域之间的映射,建立起相应的页表,并把这个映射的虚拟内存区域插入到系统为每个用户进程建立的虚拟内存空间里.Linux内核对此已作了支持,当用户进行mmap()系统调用建立三级页表时,内核函数do_mmap()会自动运行,一个新的虚拟区域会被建立同时被插入到mm_strucr结构体和虚拟区域的双向链表中.驱动的file_operations结构中的mmap()函数最终会被调用,在该函数中remap_pfn_range()会被调用以完成页表的创建,以最终完成设备内存到用户空间的映射.当发生mmap()系统调用时,do_mmap()函数接
5、收用户层传下来的参数并运行,其函数代码为: staticinlineunsignedlongdo_mmap(structfile*file,unsignedlongaddr,unsignedlonglen,unsignedlongprot,unsignedlongflag,unsignedlongoffset) { unsignedlongret=-EiNVAL; if((offset+PAGE_ALIGN(len))<offset) gotoout; if(!(offset~PAGE_MASK)) ret=do_mmap_pgoff(file,
6、addr,len,prot,flag,offset>>PAGE_SHIFT) out:returnret; } 至此,虚拟内存区域已被建立并插入到相应的链表中,接下来只需在设备驱动中实现mmap()函数,建立相应的页表,把设备的物理内存映射到建立的虚拟内存区域即可实现基于对象的内存映射的设备驱动方法,用户进程就可以直接访问设备内存,提高系统的响应速度. 3基于对象的内存映射方法实现I2C设备驱动 S3C2410处理器内部集成了一个I2C控制器,该控制器可支持主、从2种模式,本文以S3C2410作为主设备,EEPROM作为从设备实现基于对象的设备内
7、存映射方法的I2C设备驱动,对于与常规驱动架构的相似之处见 5结语 硬件设备要充分发挥其性能需要借助高效稳定的驱动程序,所以,设备驱动程序在整个计算机系统的运行中起着重要的作用.本文基于Linux的对象机制和虚拟内存机制,提出基于对象的内存映射型设备驱动方法,使用户进程能够直接访问设备内存,避免数据的反复拷贝,从而提高设备的响应速度.
此文档下载收益归作者所有