mmap/ioremap 内存相关

来源:互联网 发布:淘宝手机单刷 编辑:程序博客网 时间:2024/06/06 10:48


mmap/ioremap
一般来说,在系统运行时,外设的I/O内存资源的物理地址是已知的,由硬件的设计决定。但是CPU通常并没有为这些已知的外设I/O内存
资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内(通
过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。
void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) 
入口: phys_addr:要映射的起始的IO地址; 
size:要映射的空间的大小; 
flags:要映射的IO空间的和权限有关的标志; 
功能: 将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问; 


用mmap映射一个设备,意味着使用户空间的一段地址关联到设备内存上,这使得只要程序在分配的地址范围内进行读取或者写入,实际上就
是对设备的访问。使用mmap最典型的例子是显示卡的驱动,将显存空间直接从内核映射到用户空间将可提供显存的读写效率。
笔者在Linux源代码中进行包含"ioremap"文本的搜索,发现真正出现的ioremap的地方相当少。所以笔者追根索源地寻找I/O操作的物理地址
转换到虚拟地址的真实所在,发现Linux有替代ioremap的语句,但是这个转换过程却是不可或缺的。
两者目的不一样:
ioremap是为一段高端的物理内存建立映射(即增加相关的页表内容),驱动常用
mmap是为可能不连续的一系列逻辑上相关的(如整体是一个文件)物理内存段建立映射,
并呈现一个连续的虚拟地址空间,应用程序常用.


http://www.233.com/linux/fudao/20100914/14075091.html
常用内存分配函数


分配原理 最大内存其他
__get_free_pages 直接对页框进行操作4MB 适用于分配较大量的连续物理内存
kmem_cache_alloc 基于slab机制实现128KB 适合需要频繁申请释放相同大小内存块时使用
kmalloc 基于kmem_cache_alloc实现128KB 最常见的分配方式,需要小于页框大小的内存时可以使用
vmalloc 建立非连续物理内存到虚拟物理不连续,适合需要大内存,但是对地址连续性没有要求的场合
地址的映射  
dma_alloc_coherent 基于__alloc_pages实现4MB 适用于DMA操 作
ioremap 实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合,如设备驱动
alloc_bootmem 在启动kernel时,预留一段内存,          内核看不见小于物理内存大小,内存管理要求较高
0 0
原创粉丝点击