Linux中关于MMAPandDMA的知识总结.doc
《Linux中关于MMAPandDMA的知识总结.doc》由会员分享,可在线阅读,更多相关《Linux中关于MMAPandDMA的知识总结.doc(17页珍藏版)》请在咨信网上搜索。
1、3项技术:1,mmap系统调用可以实现将设备内存映射到用户进程的地址空间。2,使用get_user_pages,可以把用户空间内存映射到内核中。3,DMA的I/O操作,使得外设具有直接访问系统内存的能力。-内存管理内核用来管理内存的数据结构-地址内型Linux是一个虚拟内存系统,即用户程序使用的地址与硬件使用的物理地址是不等同的。虚拟内存引入了一个间接层,使得许多操作成为可能:*有了虚拟内存,系统中运行的程序可以分配比物理内存更多的内存。*虚拟地址还能让程序在进程的地址空间内使用更多的技巧,包括将程序的内存映射到设备内存上。地址内型列表*用户虚拟地址 每个进程都有自己的虚拟地址空间。*物理地址
2、 处理器访问系统内存时使用的地址。*总线地址 在外围总线和内存之间使用。MMU可以实现总线和主内存之间的重新映射。 当设置DMA操作时,编写MMU相关的代码是一个必需的步骤。*内核逻辑地址 内核逻辑地址组成了内核的常规地址空间,该地址映射了部分(或全部)内存, 并经常被视为物理地址。在大多数体系架构中,逻辑地址与其相关联的物理地址 的不同,仅仅在于它们之间存在一个固定的偏移量。kmalloc返回的内存就是 内核逻辑地址。*内核虚拟地址 内核虚拟地址与逻辑地址相同之处在于,都将内核空间的地址映射到物理地址上。 不同之处在于,内核虚拟地址与物理地址的映射不是线性的和一对一的。 vmalloc返回一
3、个虚拟地址,kmap函数也返回一个虚拟地址。-物理地址和页物理地址被分为离散的单元,称之为页。系统内部许多对内存的操作都是基于单个页的。大多数系统都使用每页4096个字节,PAGE_SIZE 给出指定体系架构下的页大小。观察内存地址,无论是虚拟的还是物理的,它们都被分为页号和一个页内的偏移量。如果每页4096个字节,那么最后的12位就是偏移量,剩余的高位则指定页号。页帧数:将除去偏移量的剩余位移到右端,称该结果为页帧数。-高端与低端内存内核(在x86架构中)将4GB的虚拟地址空间分割为用户空间和内核空间。一个典型的分割是将3GB分配给用户空间,1GB分配给内核空间。占用内核地址空间最大的部分是
4、物理内存的虚拟映射,内核无法直接操作没有映射到内核地址空间的内存。低端内存: 只有内存的低端部分拥有逻辑地址。内核的数据结构必须放置在低端内存中。高端内存: 除去低端内存的剩余部分没有逻辑地址。它们处于内核虚拟地址之上。-内存映射和页结构内核使用逻辑地址来引用物理内存中的页。为解决在高端内存中无法使用逻辑地址的问题,内核中处理内存的函数趋向于使用指向page结构的指针。page结构用来保存内核需要知道的所有物理内存信息,对系统中的每个物理页,都有一个page结构相对应。-page结构的几个成员:atomic_t count; 对该页的访问计数。void *virtual; 如果页面被映射,则指
5、向页的内核虚拟地址; 如果未被映射,则为NULL。 低端内存页总是被映射,而高端内存页通常不被映射。unsigned long flags; 描述页状态的一系列标志。 PG_locked表示内存中的页已经被锁住, 而PG_reserved表示禁止内存管理系统访问该页。-内核维护了一个或者多个page结构的数组,用来跟踪系统中的物理内存。-有一些函数和宏用来在page结构指针与虚拟地址之间进行转换:struct page *virt_to_page(void *kaddr); 将内核逻辑地址转换为响应的page结构指针。struct page *pfn_to_page(int pfn);针对给定
6、的页帧号,返回page结构指针。void *page_address(struct page *page); 如果地址存在的话,则返回页的内核虚拟地址。void *kmap(struct page *page); 为系统中的页返回内核虚拟地址。对于低端内存页,它只返回页的逻辑地址;对于高端内存页,kmap在专用的内核地址空间创建特殊的映射。void kunmap(struct page *page);释放由kmap创建的映射。void *kmap_atomic(struct page *page,enum km_type type);void kunmap_atomic(void *addr,
7、enum km_type type);,是kmap的高性能版本。-页表在任何现代的系统中,处理器必须使用某种机制,将虚拟地址转化为响应的物理地址,这种机制成为页表。-虚拟内存区虚拟内存区(VMA)用于管理进程地址空间中不同区域的内核数据结构。可以将其描述为“拥有自身属性的内存对象”。进程的内存映射包含下面这些区域:*可执行代码区域*多个数据区:初始化数据,非初始化数据(BSS),程序堆栈。*与每个活动的内存映射对应的区域#cat /proc/1/maps可以了解进程的内存区域。/proc/self始终指向当前进程。每行都是用下面的形式表示的:start-end perm offset majo
8、r:minor inode image在/proc/*/maps中的每个成员(除映像名外)都与vm_area_struct结构中的一个成员对应:startend该内存区域的起始处和结束处的虚拟地址。perm读、写和执行权限,最后一位若是p表示私有,s表示共享。offset内存区域在映射文件中的起始位置。majorminor拥有映射文件的设备的主设备号和次设备号。inode被映射的文件的索引节点号。image被映射文件的名称。-vm_area_struct结构当用户空间进程调用mmap,将设备内存映射到它的地址空间时,系统通过创建一个表示该映射的新VMA作为响应。支持mmap的驱动程序需要帮助进
9、城完成VMA的初始化。vm_area_struct结构是在中定义的。VMA的主要成员如下:unsigned long vm_start;unsigned long vm_end;该VMA所覆盖的虚拟地址范围。struct file *vm_file;指向与该区域相关联的file结构指针。unsigned long vm_pgoff;以页为单位,文件中该区域的偏移量。unsigned long vm_flags;描述该区域的一套标志。struct vm_operations_struct *vm_ops;内核能调用的一套函数,用来对该内存区进行操作。它的存在表示内存区域是一个内核“对象”。voi
10、d *vm_private_data;驱动程序用来保存自身信息的成员。vm_operations_struct结构的几个成员:void (*open)(struct vm_area_struct *vma);void (*close)(struct vm_area_struct *vma);struct page *(*nopage)(struct vm_area_struct *vma, unsigned long address,int *type);int (*populate)(struct vm_area_struct *vm, unsigned long address,unsig
11、ned long len, pgprot_t prot,unsigned long pgoff,int nonblock);-内存映射处理在系统中的每个进程都拥有一个struct mm_struct结构,其中包含了虚拟内存区域链表、页表以及其他大量内存管理信息,还包含一个信号灯(mmap_sem)和一个自旋锁(page_table_lock)。-mmap设备操作对于驱动程序来说,内存映射可以提供给用户程序直接访问设备内存的能力。映射一个设备意味着将用户空间的一段内存与设备内存关联起来。无论何时当程序在分配的地址范围内读写时,实际上访问的就是设备。要注意:像串口和其它面向流的设备不能进行mmap
12、抽象。必须以PAGE_SIZE为单位进行映射。-rmpap_pfn_range和io_remap_page_range为一段物理地址建立新的页表。int remap_pfn_range(struct vm_area_struct *vm, unsigned long virt_addr,unsigned long pfn, unsigned long size,pgprot_t prot);int io_remap_page_range(struct vm_area_struct *vma, unsigned long virt_addr,unsigned long phys_addr, un
13、signed long size,pgprot_t prot);vma:虚拟内存区域,在一定范围内的页将被映射到该区域内。virt_addr:重新映射时的起始用户虚拟地址。该函数为处于virt_addr和virt_addr+size 之间的虚拟地址建立页表。pfn:与物理内存对应的页帧号,虚拟内存将要被映射到该物理内存上。size:以字节为单位,被重新映射的区域大小。prot:新VMA要求的保护属性。-一个简单的实现static int simple_remap_mmap(struct file *filp,struct vm_area_struct *vma)if(remap_pfn_ran
14、ge(vma,vma-vm_start,vma-vm_pgoff, vma-vm_end-vma-vm-vm_start,vma-vm_page_prot) return -EAGAIN;vma-vm_ops = &simple_remap_vm_ops;simple_vma_open(vma);return 0;可见,重新映射内存就是调用remap_pfn_range函数创建所需的页表。-为VMA添加操作vm_area_struct结构包含了一系列针对VMA的操作。void simple_vma_open(struct vm_area_struct *vma)printk(KERN_NOTI
15、CE Simple VMA open,virt %lx,phys %lxn, vma-vm_start,vma-vm_pgoff PAGE_SHIFT);void simple_vma_close(struct vm_area_struct *vma)printk(KERN_NOTICE Simple VMA close.n);static struct vm_operations_struct simple_remap_vm_ops = .open = simple_vma_open,.close = simple_vma_close,;-使用nopage映射内存有时驱动程序对mmap的实现
16、必须具有更好的灵活性,在这种情况下,提倡使用VMA的nopage方法实现内存映射。如果要支持mremap系统调用,就必须实现nopage函数。struct page *(*nopage)(struct vm_area_struct *vma, unsigned long address,int *type);-重映射特定的I/O区域一个典型的驱动程序只映射与其外围设备相关的一小段地址,而不是映射全部地址。-重新映射RAM-使用nopage方法重映射RAM-重新映射内核虚拟地址-执行直接I/O访问实现直接I/O的关键是get_user_pages()函数:int get_user_pages(s
17、truct task_struct *tsk,struct mm_struct *mm, unsigned long start,int len,int write,int force, struct page *pages,struct vm_area_struct *vmas);-异步I/Ossize_t (*aio_read)(),ssize_t (*aio_write)(),ssize_t (*aio_fsync)()-直接内存访问 DMADMA是一种硬件机制,它允许外围设备和主内存之间直接传输它们的I/O数据,而不需要系统处理器的参与。-DMA数据传输概览有两种方式引发数据传输:1,
18、软件对数据的请求,比如通过read函数。2,硬件异步地将数据传递给系统。第一种情况的步骤如下:1)当进程调用read,驱动程序分配一个DMA缓冲区,并让硬件将数据传输到这个缓冲区中。进程处于睡眠状态。2)硬件将数据写入到DMA缓冲区中,当写入完毕,产生一个中断。3)中断处理程序获得输入的数据,应答中断,并且唤醒进程,该进程即可读取数据。第二种情况发生在异步使用DMA时。比如对于一个数据采集设备,即使没有进程读取数据,它也不断地写入数据。此时,驱动程序应该维护一个缓冲区,其后的read调用将返回所有积累的数据给用户空间。这种传输方式的步骤如下:1)硬件产生中断,宣告新数据的到来。2)中断处理程序
19、分配一个缓冲区,并且告诉硬件向哪里传输数据。3)外围设备将数据写入缓冲区,完成后产生另外一个中断。4)处理程序分发新数据,唤醒任何相关进程,然后执行清理工作。高效的DMA处理依赖于中断报告!-分配DMA缓冲区使用DMA缓冲区的主要问题是:当大于一页时,它们必须占据连续的物理页,这是因为使用ISA或者PCI系统总线传输数据,而这两种方式使用的都是物理地址。驱动程序作者必须谨慎地为DMA操作分配正确的内存类型,因为并不是所有内存区间都适合DMA操作。在实际操作中,一些设备和一些系统中的高端内存不能用于DMA,这是因为外围设备不能使用高端内存的地址。对于有限制的设备,应使用GFP_DMA标志调用km
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 关于 MMAPandDMA 知识 总结
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。