当前位置: 首页 > news >正文

50 vmalloc 的实现

前言

这里说的是 内核中分配按页分配的场景 

常用于 驱动什么的, 分配 中大型空间 

由于 连续的 n 个页是分别使用 alloc_pages 分配的, 因此是 虚拟地址空间连续, 但是 物理地址空间不连续 

 

 

如何分配对象

两个步骤, __get_vm_area_node 获取为 size 分配的 vma 区间, 然后 __vmalloc_area_node 为给定的 vma 分配 n 个物理页 

fb926df531e64551b3ad5ccb454140d0.png

 

首先是定位查询可用空间的起点

free_vmap_cache 的作用是顺序分配的时候快速的定位 first

否则需要从 vmap_area_root 开始, 找到第一个大于 vmalloc 区间的 vma, 然后开始向后查询, 如果没有找到 使用 vstart 作为起始地址[vmalloc区间的第一块空间]

从 first 开始向后查询, 查询第一块空闲的可以容下 size 的空间, 来分配空间 

如果是遍历到 vmap_area_list[是维护了虚拟地址顺序的] 的末尾, 以最后一块 vma 的 end 作为起始地址

找到空间 之后判断是否 overflow, 如果 overflow 走清理空间, 然后重试的处理 

然后以 [addr, addr+size)作为当前待分配的 vma 的空间, 然后将 vma 添加到 vmap_area_root 上面, 以及将添加到 vmap_area_list 中[按照虚拟地址排序]

 

e3da4b31b8a84c1da2965f741da3c4f5.png509908496e4b4780ae40ba1fa0105dec.png

 

 

purge_vmap_area_lazy

寻找 vmap_purge_list 的地址空间的区间, 如果没有待释放的 vma, 直接返回 

否则 以此 __free_vmap_area, 更新统计信息 

 

0f1f6d3b3d3b48e59cd15bc846a38971.png

 

从 vmap_area_root 中删除当前 vma, 从 vmap_area_list 中删除当前 vma 

a00d2f9a0e96416b81383c4650440f88.png

 

__vmalloc_area_node 计算 size 所需要的物理页的数量 

然后循环 alloc_pages 分配物理页, 并和 vma 建立关联, 注册页表关联 等等

58cf4c61b55b460e947a878fbc41fbe0.png

 

 

如何释放空间  

remove_vm_area 为将 addr 对应的 vma 添加到 vmap_purge_list, 移除相关注册的 页表关联 

__free_pages 清理掉关联的相关物理页 

真实的 vma 相关数据的清理是在 xxx_purge_vmap_area_xx 相关函数中具体去实现 

ab95437ae82243118d05d4b9f89f10c1.png

 

将当前 vma 添加到 vmap_purge_list, 如果超过了 阈值, 则直接 try_purge_vmap_area_lazy 清理空间 

否则是在 分配空间的时候, vma 不够的时候 会 purge_vmap_area_lazy 清理空间 

72e1e0d30c4149c1b78f87ae9947b7c9.png

 

 

 

 

 

http://www.lryc.cn/news/309694.html

相关文章:

  • 程序员的金三银四求职宝典!
  • day04_拦截器Apifox角色管理(登录校验,API接口文档,权限管理说明,角色管理,添加角色,修改角色,删除角色)
  • 在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录
  • 【刷题】模拟
  • 【打工日常】使用docker部署在线Photopea用于linux下替代ps
  • leetcode 热题 100_盛最多水的容器
  • 基本正则表达式
  • sqlserver保存微信Emoji表情
  • 网络编程 io_uring
  • Java中的static
  • 如何在群晖Docker运行本地聊天机器人并结合内网穿透发布到公网访问
  • lv20 QT进程线程编程
  • 什么是机器人学习?
  • 裸机程序--时间片调度
  • 【web APIs】5、(学习笔记)有案例!
  • 【刷题1】LeetCode 994. 腐烂的橘子 java题解
  • Java的运行机制与Java开发环境的搭建
  • 【Java】面向对象之多态超级详解!!
  • react 路由的基本原理及实现
  • [极客大挑战 2019]LoveSQL1 题目分析与详解
  • 探索RedisJSON:将JSON数据力量带入Redis世界
  • 【精通Spring】基于注解管理Bean
  • Python爬虫——Urllib库-3
  • JAVA工程师面试专题-《消息队列》篇
  • Unity3d Shader篇(十一)— 遮罩纹理
  • 测试开发(6)软件测试教程——自动化测试selenium(自动化测试介绍、如何实施、Selenium介绍 、Selenium相关的API)
  • 【flink】Rocksdb TTL状态全量快照持续递增
  • [C++] 统计程序耗时
  • Redis是单线程还是多线程?
  • 【MySQL】MySQL数据管理——DDL数据操作语言(数据表)