用户态内存映射和内核态内核映射

用户态内存映射

mmap的原理

在虚拟地址空间那一节,我们知道,每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同的内存块,这个变量的名字叫mmap。

其实内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。

用户态的内存映射机制,我们解析的差不多了,我们来总结一下,用户态的内存映射机制包含以下几个部分。

  • 用户态内存映射函数mmap,包括用它来做匿名映射和文件映射。

  • 用户态的页表结构,存储位置在mm_struct中。

  • 在用户态访问没有映射的内存会引发缺页异常,分配物理页表、补齐页表。如果是匿名映射则分配物理内存;如果是swap,则将swap文件读入;如果是文件映射,则将文件读入。

内核态内存映射

物理内存根据NUMA架构分节点。每个节点里面再分区域。每个区域里面再分页。

物理页面通过伙伴系统进行分配。分配的物理页面要变成虚拟地址让上层可以访问,kswapd可以根据物理页面的使用情况对页面进行换入换出。

对于内存的分配需求,可能来自内核态,也可能来自用户态。

  • 对于内核态kmalloc在分配大内存的时候,以及vmalloc分配不连续物理页的时候,直接使用伙伴系统,分配后转换为虚拟地址,访问的时候需要通过内核页表进行映射。
    对于kmem_cache以及kmalloc分配小内存,则使用slub分配器,将伙伴系统分配出来的大块内存切成一小块一小块进行分配
    kmem_cache和kmalloc的部分不会被换出,因为用这两个函数分配的内存多用于保持内核关键的数据结构。内核态中vmalloc分配的部分会被换出,因而当访问的时候,发现不在,就会调用do_page_fault。

  • 对于用户态,或者直接调用mmap系统调用分配,或者调用malloc。调用malloc的时候,如果分配小的内存,就用sys_brk系统调用;如果分配大的内存,还是用sys_mmap系统调用。正常情况下,用户态的内存都是可以换出的,因而一旦发现内存中不存在,就会调用do_page_fault。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 在互联网时代,大部分的应用程序基本都是IO密集型,而IO密集型的程序运行效率的关键在于内存管理,因此充分理解...
    淡泊宁静_3652阅读 5,895评论 0 8
  • 用户态和内核态的区别 1. 内存空间上:内核访问虚拟地址3~4G,物理地址0~4G;用户态访问虚拟地址0~3G,以...
    my_little_world阅读 5,451评论 0 0
  • 1) Linux中主要有哪几种内核锁? 说明:在多核处理器下,会存在多个进程处于内核态的情况,在内核态下,进程是可...
    郑行_aover阅读 3,483评论 0 0
  • 进程 创建 创建进程用fork()函数。fork()为子进程创建新的地址空间并且拷贝页表。子进程的虚拟地址空间...
    梅花怒阅读 5,960评论 0 7
  • 系统调用 用户进程与内核进行交互的一组接口; 需要C库支持,通过使用C库定义的函数来访问系统调用 系统调用、中断、...
    Supreme_DJK阅读 2,187评论 0 0