LINUX内存管理办法.doc_第1页
LINUX内存管理办法.doc_第2页
LINUX内存管理办法.doc_第3页
LINUX内存管理办法.doc_第4页
LINUX内存管理办法.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 ARM中有个储存控制器:8个BANK,每个bank128M,共1G。S3C2410、2440对外引出的27根地址线ADDR0ADDR26,因此访问范围只有128MB, 那么如何达到1G的访问空间呢?CPU还对外引出了8根片选信号线Ngcs0Ngcs7,对应于BANK0BANK7。每个BANK可接一种ROMSRAM(网卡等),BANK67可以接SDRAM,每个BNAK都有自己的起始地址和结束地址,具体外接的ROMSRAM使用的地址要根据BANK的起始地址和ROM、SRAM使用的地址线的条数。2、 内存管理单元MMU:MMU负责虚拟地址到物理地址的映射、内存访问权限的保护(用户空间不能直接访问内核空间)。32位的CPU虚拟内存地址范围为00xFFFFFFFF(4G的地址访问空间),我们把这个地址范围称为虚拟地址空间,其中的某个地址称为虚拟地址。物理地址到虚拟地址的映射,虚拟地址到物理地址的转换(程序才能访问内存)都要用到MMU。因此没启动MMU时,CPU核、cache、MMU、物理外设使用的都是物理地址,启动MMU后,cpu看到的是虚拟地址VA,caches和MMU看不见VA,只能看见变化后的虚拟地址MVA,实际的物理设备看不到VA和MVA,读写它们时使用的是物理地址PA。3、 虚拟地址到物理地址的转换过程:4、 虚拟地址就是线性地址,比如ARM是32位5、 逻辑地址是程序编译以后得到的汇编代码使用的地址,物理地址就是具体的内存地址6、 CPU要将一个逻辑地址转换成为物理地址,程序才能访问具体的设备。需要两步:首先CPU利用段式内存管理单元,将逻辑地址转换成线性地址(虚拟地址),再利用页式内存管理单元把线性地址最终转换成物理地址7、 什么是段式管理单元。把虚拟内存分为一段一段的形式,称为逻辑段。一个逻辑段由段基地址和段内偏移量组成8、 逻辑地址=段基地址(保持在段基地址寄存器)+段内偏移量 线性地址=段寄存器的值x16+逻辑地址的偏移量。实现了逻辑地址到线性地址的转变。(是在16位X86里面用的)9、 Linux系统有限制的使用了段式管理技术(把基地址设为0)而使用的是页式管理技术。把线性地址被分为固定长度的组,每个组称为页。而物理页是划分实在的物理存储单元。用映射关系就可以从虚拟地址访问物理地址(从页到物理页)。怎么从线性地址找到具体的页?看下面的图可知:32位的线性地址前10位保存的是物理页目录信息,中间10位保存的是物理页表信息,最后的12位保存的是OFFSET就可得到具体的哪个物理页,也就从虚拟地址到物理地址的转变。也称为映射。Cr3称为页表基址寄存器。10、 在linux中,因为每个段的基地址为0,所以逻辑地址和线性地址(虚拟地址)保持一致。逻辑地址=线性地址=虚拟地址,linux完全使用页式管理。11、12、 用户空间:用户进程运行在3G的用户空间,所以每当进程切换,用户空间也要变化(页目录和页表会变化)。用malloc来分配这里的地址,利用的是请页机制。利用MMAP函数可以把设备的物理地址映射到用户空间,那就实现了直接在用户空间访问设备。内核空间也不能直接访问物理内存,要通过系统调用后在内核空间才能访问内存用malloc分配到的只是虚拟地址,只有在真正访问这些虚拟地址的时候,系统才调用请页机制(分页技术)来实现从虚拟地址到物理地址的转变。13、 内核地址空间:首先是直接内存映射区,也称物理内存映射区,一般长度为896MB,这里对应了具体物理设备的0896MB,只是有一个3G的偏移,把外接的SDRAM的首地址映射到3GB处。一般用kmalloc、get_free_pages来申请这个区域的内存。这里的虚拟地址到物理地址的转换很简单,只要把虚拟地址-3GB就得到了对应的物理地址。再到动态(虚拟)内存映射区,vmalloc函数分配的内存在这里,还有IOremap分配的也是内核空间的虚拟内存区。 再到高端内存映射区,访问物理内存896M以上的内存,先使用alloc_page(_GFP_HIGHMEM)分配高端内存页,在用KMAP函数将分配到的高端内存映射到该区域。二、DMA1、访问内存直接跳过了CPU,在使用kmalloc,_get_free_pages()及其类似的函数申请DMA 缓冲区时要使用GFP_DMA标志,这样能保证获得的内存位于DMA_ZONE,是具备DMA能力的。 内核中定义了快捷方式_get_dma_pages()来申请,内自带了GFP_DMA标志和order页指数。也可用dma_mem_alloc(int size)函数。 2、总线地址是从设备角度上看到的内存地址。DMA缓冲区要考虑cache(高速缓存,把反复使用的大小相同的内存块集中在一个内存池里面)一致性,同样一个数据可能存在cache中,也纯在于主存中,cache与主存的数据一样就一致,因为在使能DMA的区域内,内存可能被DMA修改了,但是CPU不知道,依然使用陈旧的cache数据,这样就发生了cache与内存之间数据不一致的错误。为了分配的DMA一致性,我们用dma_alloc_coherent ()函数来分配DMA区域。但是并不是所有的DMA缓冲区都是驱动申请的,如果是驱动申请的直接用上面的函数申请就确保了一致性。但很多情况下缓冲区来自内核的较上层(如网络报文),上层很可能是使用kmalloc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论