美文网首页面试精选
用户态内存映射和内核态内核映射

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

作者: 技术灭霸 | 来源:发表于2021-04-24 13:25 被阅读0次

    用户态内存映射

    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。

    相关文章

      网友评论

        本文标题:用户态内存映射和内核态内核映射

        本文链接:https://www.haomeiwen.com/subject/yvakrltx.html