内存映射

来源:互联网 发布:软件开发人员工作总结 编辑:程序博客网 时间:2024/06/03 15:58

内存映射


     运行可执行文件时,先被映射到进程的虚拟地址空间中,形成vm_area_struct结构链表,接着程序的一部分被操作系统装入到物理内存。这种将映像连接到进程虚拟地址空间的方法称为"内存映射"。通过内存映射,文件的内容被直接链接到进程的虚拟地址空间。

    随着vm_area_struct结构的生成,这些结构所描述的虚拟内存区域上的标准操作函数也由linux初始化.在逻辑地址和物理地址之间相互转换的工作,是由内核和硬件内存管理单元(MMU)共同完成的,MMU是CPU的一部分.内核告诉MMU告诉MMU如何为每个进程把逻辑页面映射到某特定物理页面,而MMU在进程提出内存请求时完成实际的转换工作.为了减少开销,最近被执行过的地址转换结果将被存储在MMUd的转换后备缓存(TLB)内.除了由于内核的操作致使TLB无效偶尔会通过CPU外,Linux不会明确管理TLB.


struct page和虚拟地址之间进行转换(asm/page.h);

struct page *virt_to_page(void *kaddr);这个宏接受一个内核逻辑地址,并返回与其关联的struct page指针.因为它需要一个逻辑地址,它对vmalloc返回的内存和高端内存无效.(vmalloc返回的是虚拟地址)

void *page_address(struct page *page); 如果这个地址存在,则返回该页的内核虚拟地址。对于高端内存,仅在该页已经被映射的情况下,其地址存在.

   

与内存映射相关的几个文件在mm目录下,其中,mmap.c文件中主要函数do_mmap的功能是:把文件中的逻辑地址映射成虚存的线性地址,即把从文件结构中得到的逻辑地址转换成vm_area_struct结构所需的地址.mremap.c文件中主要函数sys_mremap.c的功能是:扩张或缩小现存的虚拟内存空间.filemap.c文件中的主要函数功能:处理内存映射和页高速缓存器,即把线性地址空间映射到内存且修改页高速缓存,这部分含有从磁盘读写的I/O操作。