用户态和内核态原理详解
2023-04-18 15:37:08 时间
mmap的原理
在虚拟地址空间那一节,我们知道,每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同的内存块,这个变量的名字叫mmap。
其实内存映射不仅仅是 物理内存和虚拟内存之间的映射 ,还包括将 文件中的内容映射到虚拟内存空间
。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。
用户态的内存映射机制,我们解析的差不多了,我们来总结一下,用户态的内存映射机制包含以下几个部分。
- 用户态内存映射函数mmap,包括用它来做匿名映射和文件映射。
- 用户态的页表结构,存储位置在mm_struct中。
- 在用户态访问没有映射的内存会引发缺页异常,分配物理页表、补齐页表。如果是匿名映射则分配物理内存;如果是swap,则将swap文件读入;如果是文件映射,则将文件读入。
内核态内存映射
物理内存根据 NUMA架构 分节点。每个节点里面再分区域。每个区域里面再分页。
物理页面通过 伙伴系统 进行分配。分配的物理页面要变成虚拟地址让上层可以访问,kswapd可以根据物理页面的使用情况对页面进行换入换出。
对于内存的分配需求,可能来自内核态,也可能来自用户态。
- 对于内核态 , kmalloc在分配大内存 的时候,以及vmalloc分配不连续物理页的时候,直接使用伙伴系统,分配后转换为虚拟地址,访问的时候需要通过内核页表进行映射。undefined对于kmem_cache以及kmalloc分配小内存,则使用slub分配器,将伙伴系统分配出来的大块内存切成一小块一小块进行分配 。undefinedkmem_cache和kmalloc的部分不会被换出,因为用这两个函数分配的内存多用于保持内核关键的数据结构。内核态中vmalloc分配的部分会被换出,因而当访问的时候,发现不在,就会调用do_page_fault。
- 对于用户态 ,或者 直接调用mmap系统调用分配,或者调用malloc 。调用malloc的时候,如果分配小的内存,就用sys_brk系统调用;如果分配大的内存,还是用sys_mmap系统调用。正常情况下,用户态的内存都是可以换出的,因而一旦发现内存中不存在,就会调用do_page_fault。
相关文章
- centos7多网口配置同网段IP解决方案
- LGV 引理
- 【网关开发】9.Openresty 自定义流量分流策略支持灰度(金丝雀)等发布业务场景
- 产品经理
- Centos7单机部署Etcd
- 易基因|DNA甲基化研究的测序数据挖掘思路:干货分享
- MegEngine 使用小技巧:使用 Netron 实现模型可视化
- 网络时间同步设备(时钟同步)产品的功能及技术参数
- 记Cucumber行为驱动测试的简单配置与使用方式
- 产品经理,项目经理,FTO
- 18、实体类对象比对-JSON
- 死锁面试题
- CPU推理|使用英特尔 Sapphire Rapids 加速 PyTorch Transformers
- 第二章 物理层
- 47.多态
- 量化交易基础 - 007 - 研究
- 干翻 nio ,王炸 io_uring 来了 !!(图解+史上最全)
- 第八章 从源文件到可执行文件
- Windows 上 Docker 部署 MongoDb 并构建数据持久化
- k8s~ingress限流机制