




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,上章回顾,.,内存与I/O访问,第6章,.,预习检查,.,本章目标,掌握linux内存分配的常用方法及区别了解linux的内存管理掌握mmap系统调用的实现过程了解直接内存访问(DMA)操作,.,本章结构,Linux内存管理,中断与时钟,时间、延迟及延缓操作,kmalloc函数,后背高速缓存,get_free_page和相关函数,vmalloc及辅助函数,分配内存,获取大的缓冲区,虚拟地址与物理地址关系,I/O端口和I/O内存访问,I/O端口和I/O内存访问接口,申请与释放I/O端口和I/O内存,将设备地址映射到用户空间,时间、延迟及延缓操作,DMA,DMA和Cache一致性问题,Linux下DMA编程,.,6.1Linux内存管理,地址类型物理地址和页内存映射和页结构页表内存管理结构,.,6.1.1Linux地址类型,用户虚拟地址用户空间程序所能看到的常规地址每个进程都有自己的虚拟地址空间物理地址该地址在处理器和系统内存之间使用总线地址该地址在外围总线和内存之间使用它实现总线和主内存之间的重新映射通常它们与处理器使用的物理地址相同,.,6.1.1Linux地址类型,内核逻辑地址内核逻辑地址组成了内核的常规地址空间。该地址映射了部分(或者全部)内存,并经常被视为物理地址。与物理地址是线性映射的例如,kmalloc返回的是逻辑地址内核虚拟地址内核虚拟地址和逻辑地址的相同之处在于,它们都将内核空间的地址映射到物理地址上。与物理地址不必是线性映射关系例如,vmalloc与kmap都是返回内核虚拟地址地址的转换_pa(logical-addr)_va(physical-addr),.,6.1.1Linux地址类型,Linux中使用的地址类型,.,6.1.2物理地址和页,物理地址被分成离散的大小相等单元,称之为页Linux系统内部许多对内存的操作都是基于页的。每个页的大小通常为4096个字节,具体的大小在中用PAGE_SIZE定义,页号PAGE_SHIFT,11,12,0,31,.,6.1.3内存映射和页结构,page的数据结构:structpage;atomic_tcount;对该页的访问计数。当计数值为0时,该页将返回给空闲链表。void*virtual;如果页面被映射,则指向页的内核虚拟地址;如果未被映射则为NULL。unsignedlongflags;描述页状态的一系列标志.PG_locked表示内存中的页已经被锁住PG_reserved表示禁止内存管理系统访问该页。,.,12,6.1.3内存映射和页结构,内核维护了一个或者多个page结构数组,用来跟踪系统中的物理内存。在一些系统中,有一个单独的数组称之为mem_map。另一些系统,如NUMA,会及其复杂可移植性考虑,代码不要直接访问那些数组,.,13,6.1.3内存映射和页结构,page结构指针与虚拟地址之间进行转换,structpage*virt_to_page(void*kaddr);structpage*pfn_to_page(intpfn);,void*kmap(structpage*page);voidkunmap(structpage*page);,void*kmap_atomic(structpage*page,enumkm_typetype);voidkunmap_atomic(void*addr,enumkm_typetype);,KM_USER0和KM_USER1(针对在用户空间中直接运行的代码),KM_IRQ0和KM_IRQ1(针对中断处理程序),.,14,6.1.4页表,通常处理器必须使用某种机制,将虚拟地址转换为相应的物理地址。这种机制被称为页表。是一个多层树形结构幸运的是,对驱动程序作者来说,在2.6版内核中删除了对页表直接操作的需求,.,15,6.1.5内存管理结构,每个进程(除了内核空间的一些辅助线程外)都拥有一个structmm_struct结构(在中定义)。mm_struct结构包含了虚拟内存区域链表、页表以及其他大量内存管理信息一个信号灯(mmap_sem)和一个自旋锁(page_table_lock)多个进程可以共享内存管理结构,Linux就是用这种方法实现线程的。驱动程序可直接通过current-mm访问mm_struct结构,.,16,6.2分配内存,内核为设备驱动程序提供了一致的内存管理接口分配内存的方法包括kmalloc函数后备高速缓存get_free_page和相关函数vmalloc及其辅助函数获取大的缓冲区,.,17,6.2.1kmalloc函数,#includevoid*kmalloc(size_tsize,intflags);,分配的内存大小(字节数)通常最好不要分配大于128KB的内存,GFP_KERNEL:为内核空间分配内存,可能睡眠GFP_ATOMIC:在中断处理例程或其他运行子程上下文之外的代码中分配内存,不会休眠。,.,18,6.2.2后备高速缓存,设备驱动程序常常会反复地分配很多同一大小的内存块。为了满足这样的应用,内核的实现了这种形式的内存池,通常称为后备高速缓存(lookasidecache)。Slab分配器Kmalloc的机制是基于slab分配器的后备高速缓存的操作createdestroyallocatefree,.,19,6.2.3get_free_page和相关函数,Kmalloc要求分配的内存大小应该小于128KB,大于128Kb的怎么办?分配页面函数或宏释放页面函数,unsignedlongget_zeroed_page(unsignedintflags);unsignedlong_get_free_page(unsignedintflags);unsignedlong_get_free_pages(unsignedintflags,unsignedintorder);,voidfree_page(unsignedlongaddr);voidfree_pages(unsignedlongaddr,unsignedlongorder);,为什么以指数?,.,20,6.2.4vmalloc及其辅助函数,vmalloc分配虚拟地址空间的连续区域,但这段区域在物理上可能是不连续的。,#includevoid*vmalloc(unsignedlongsize);voidvfree(void*addr);,.,21,6.2.4vmalloc及其辅助函数,vmalloc分配得到的地址是不能在微处理器之外使用的,当驱动程序需要真正的物理地址时(像外设用以驱动系统总线的DMA地址),就不能使用vmalloc;使用vmalloc函数的正确场合是在分配一大块连续的、只在软件中存在的、用于缓冲的内存区域的时候。因为vmalloc不但获取内存,还要建立页表,它的开销_get_free_pages大,因此,用vmalloc函数分配仅仅一页的内存空间是不值得的。,.,6.2.4vmalloc及其辅助函数,IO映射函数和vmalloc一样,ioremap也建立新的页表,但和vmalloc不同的是,ioremap并不实际分配内存。为了保持可移植性,不应把ioremap返回的地址当作指向内存的指针而直接访问。相反,应该使用readb或其他I/O函数。,void*ioremap(unsignedlongoffset,unsignedlongsize);voidiounmap(void*addr);,.,23,6.2.4vmalloc及其辅助函数,vmalloc和kmalloc区别vmalloc分配得到的地址是不能在微处理器之外使用的,当驱动程序需要真正的物理地址时(像外设用以驱动系统总线的DMA地址),就不能使用vmalloc;通常,kmalloc分配小于128KB的内存,vmalloc可以分配更大的内存;vmalloc不能在原子上下文中使用,因为它的内部实际调用了kmalloc(GFP_KERNEL);,.,24,6.3虚拟地址与物理地址关系,内核虚拟地址转化为物理地址物理地址转化为内核虚拟地址,#define_pa(x)(unsignedlong)(x)-PAGE_OFFSET)externinlineunsignedlongvirt_to_phys(volatilevoid*address)return_pa(address);,#define_va(x)(void*)(unsignedlong)(x)+PAGE_OFFSET)externinlinevoid*phys_to_virt(unsignedlongaddress)return_va(address);,.,阶段总结,Linux内存管理的一些基本概念地址类型页,页的结构,页表Linux内存分配的主要方法和区别Kmallocget_free_pageVmalloc等虚拟地址与物理地址关系,.,26,6.4I/O端口和I/O内存访问,设备通常会提供一组寄存,如控制寄存器、数据寄存器和状态寄存器等。这些寄存器可能位于I/O空间,也可能位于内存空间当这些寄存器位于I/O空间时,通常被称为I/O端口当这些寄存器位于内存空间时,对应的内存空间被称为I/O内存通常,除X86外,嵌入式处理器(比如ARM,PowerPC等)一般只存在内存空间,.,27,6.4.1I/O端口和I/O内存访问接口,IO端口的操作,unsignedinb(unsignedport);voidoutb(unsignedcharbyte,unsignedport);,unsignedinl(unsignedport);voidoutl(unsignedlongword,unsignedport);,voidinsb(unsignedport,void*addr,unsignedlongcount);voidoutsb(unsignedport,void*addr,unsignedlongcount);,voidinsw(unsignedport,void*addr,unsignedlongcount);voidoutsw(unsignedport,void*addr,unsignedlongcount);,voidinsl(unsignedport,void*addr,unsignedlongcount);voidoutsl(unsignedport,void*addr,unsignedlongcount);,unsignedinw(unsignedport);voidoutw(unsignedshortword,unsignedport);,.,28,6.4.1I/O端口和I/O内存访问接口,IO内存在内核中访问I/0内存之前,需首先使用ioremap()函数将设备所处的物理地址映射到虚拟地址,ioremap()的原型如下:访问函数,void*ioremap(unsignedlongoffset,unsignedlongsize);,unsignedintioread8(void*addr);unsignedintioread16(void*addr);unsignedintioread32(void*addr);,unsignedreadb(address);unsignedreadw(address);unsignedreadl(address);,voidiowrite8(u8value,void*addr);voidiowrite16(u16value,void*addr);voidiowrite32(u32value,void*addr);,voidwriteb(unsignedvalue,address);voidwritew(unsignedvalue,address);voidwritel(unsignedvalue,address);,.,29,6.4.1I/O端口和I/O内存访问接口,voidioread8_rep(void*addr,void*buf,unsignedlongcount);voidioread16_rep(void*addr,void*buf,unsignedlongcount);voidioread32_rep(void*addr,void*buf,unsignedlongcount);,voidiowrite8_rep(void*addr,constvoid*buf,unsignedlongcount);voidiowrite16_rep(void*addr,constvoid*buf,unsignedlongcount);voidiowrite32_rep(void*addr,constvoid*buf,unsignedlongcount);,voidmemcpy_fromio(void*dest,void*source,unsignedintcount);voidmemcpy_toio(void*dest,void*source,unsignedintcount);,voidmemset_io(void*addr,u8value,unsignedintcount);,.,30,6.4.2申请与释放设备I/O端口和I/O内存,IO端口申请与释放IO内存的申请与释放,#includestructresource*request_region(unsignedlongfirst,unsignedlongn,constchar*name);voidrelease_region(unsignedlongstart,unsignedlongn);,structresource*request_mem_region(unsignedlongstart,unsignedlonglen,char*name);voidrelease_mem_region(unsignedlongstart,unsignedlonglen);,.,31,6.5将设备地址映射到用户空间,用户空间不能直接访问设备。设备驱动程序中可实现mmap()函数,可使得用户空间能直接访问设备的物理地址mmap()将用户空间的一段内存与设备内存关联当用户访问用户空间的这段地址范围时,会转化为对设备的访问mmap()必须以PAGE_SIZE为单位进行映射内存只能以页为单位进行映射并且进行页对齐,.,32,6.5将设备地址映射到用户空间,mmap函数的原型,int(*mmap)(structfile*filp,structvm_area_struct*vma);,用于访问设备的虚拟地址的信息:unsignedlongvm_start;unsignedlongvm_end;structfile*vm_file;unsignedlongvm_pgoff;unsignedlongvm_flags;structvm_operations_struct*vm_ops;void*vm_pivate_data;,void(*open)(structvm_area_struct*vma);void(*close)(structvm_area_struct*vma);structpage*(*nopage)(structvm_area_struct*vma,unsignedlongaddress,int*type);int(*populate)(structvm_area_struct*vm,unsignedlongaddress,unsignedlonglen,pgprot_tprot,unsignedlongpgoff,intnonblock);,.,33,6.5将设备地址映射到用户空间,建立页表的方法使用remap_pfn_range函数一次性全部建立通过nopageVMA方法每次建立一个页表,.,34,6.5.1使用remap_pfn_range,intremap_pfn_range(structvm_area_struct*vma,unsignedlongvirt_addr,unsignedlongpfn,unsignedlongsize,pgprot_tprot);,intio_remap_pfn_range(structvm_area_struct*vma,unsignedlongvirt_addr,unsignedlongphys_addr,unsignedlongsize,pgprot_tprot);,.,6.5.1使用remap_pfn_range,voidsimple_vma_open(structvm_area_struct*vma)printk(KERN_NOTICE“SimpleVMAopen,virtlx,physlxn”vma-vm_start,vma-vm_pgoffvm_pgoff,vma-vm_end-vma-vm_start,vma-vm_page_prot)return-EAGAIN;vma-vm_ops=return0;,.,37,6.6DMA,DMA(直接内存访问)是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA方式的数据传输由DMA控制器(DMAC)控制:在传输期间,CPU可以并发地执行其他任务。当DMA结束后,DMAC通过中断通知CPU数据传输已经结束然后由CPU执行相应的中断服务程序进行后处理。,.,38,6.6.1DMA与Cache一致性,所谓Cache数据与内存数据的一致性问题是指在采用Cache的系统中,同样一个数据可能圈存在于Cache中,也存在于主存中,Cache与主存中的数据一样则具有一致性,数据若不一样,则具有不一致性。假设如果DMA的目的地址与Cache所缓存的内存地址访问有重叠,经过DMA操作,Cache缓存对应的内存的数据已经被修改,而CPU本身并不知道,它仍然认为Cache中的数据就是内存中的数据,以后访问Cache映射的内存时,它仍然使用陈旧的Cache数据。这样就发生Cache与内存之间数据“不一致性”的错误。,.,39,6.6.1DMA与Cache一致性,解决Cache一致性方法最简单方法是直
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务政策与公司文化的结合计划
- 2025-2030中国闪光信标浮标行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国长裙行业发展分析及投资前景预测研究报告
- 2025-2030中国镀饰笔行业市场深度调研及价值评估与投资前景研究报告
- 2025-2030中国销售支持平台行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国铝合金桁架行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国铁金属粉行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国钻井数据管理系统行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国钢封装活动地板行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国金属锆行业市场发展趋势与前景展望战略研究报告
- 并购重组税务处理-企业管理
- 四川凉山州人民政府办公室考调所属事业单位工作人员2人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年中国艾草行业市场现状、发展概况、未来前景分析报告
- 防走失应急预案
- 临床实验室管理学学习通超星期末考试答案章节答案2024年
- 中式烹调师理论知识测试题与参考答案
- 低压电工培训教案
- 外科护理风险
- 2024年执业助理医师实践技能考试体格检查
- FURUNO 电子海图 完整题库
- 2020年全国硕士研究生招生考试《思想政治理论》真题及解析
评论
0/150
提交评论