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

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

作者: 技术灭霸 | 来源:发表于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。

相关文章

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

    用户态内存映射 mmap的原理 在虚拟地址空间那一节,我们知道,每一个进程都有一个列表vm_area_struct...

  • Linux - 用户态内存映射 和 内核态内存映射

    操作系统的内存管理,主要分为三个方面。第一,物理内存的管理,相当于会议室管理员管理会议室。第二,虚拟地址的管理,也...

  • 进程内存布局

    ARM64内核的内存布局 进程有用户态和内核态,同样进程的地址空间包括用户地址空间和内核地址空间,用户态访问用户地...

  • 内核态和用户态、

    内核态和用户态的区别 内核态切换用户态耗时的原因

  • runloop 总结篇

    用户态 和内核态1.是以权限划分,用户态不直接对如何分配内存等等进行管理,怕出各种情况等等。用户态需要切换成内核...

  • 内核态

    首先,内核函数在内存中,大家都知道内核态是调用内核的函数,因为用户空间所在等级低,那是如何来陷入内核态呢,内核态的...

  • 2019-03-25

    runLoop在没有事件处理时,休眠以避免内存占用,从 用户态->内核态 有消息处理时,由内核态->用户态 应用程...

  • Java NIO 底层原理

    一、概念说明 1、内核态(内核空间)和用户态(用户空间)的区别和联系?用户空间是用户进程所在的内存区域,系统空间是...

  • linux 内存看一篇就够了(多图)

    ​ 正文 0 内存模块 1 linux内存总体布局:内存分成用户态和内核态 4G进程地址空间解析 内核地址空间 进...

  • 【笔记】Linux内核简介

    用户态与内核态 用户态下,程序不能访问内核地址空间(数据和代码),内核态下则没有此限制。 激活内核例程的方法: 系...

网友评论

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

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