linux 中vmalloc实现简述

vmalloc 用途

vmalloc只用于内核模块的逻辑地址分配,也就是说它的逻辑地址是挂在init_mm的pgd页表上的。它可将几段不连续物理区域合并分配一个连续逻辑区域。主要用于内核和驱动。

vmalloc 实现

入口在__vmalloc_node_range。
首先分配一个vm_struct,分配一个逻辑地址区到给它,并插入全局vmap_area_root红黑树中(__alloc_vmap_area),逻辑地址区的范围在VMALLOC_START(0xffffc90000000000UL)到VMALLOC_END之间,大小为32T。
通过kmalloc_node分配一组struct page,然后用页分配器分配从per cpu page list 分配一批页(__alloc_pages_bulk,不是调用page_alloc接口去分配多页的块),当pcplist中不足时,会从buddy上再分配一批页到pcplist上。buddy选择numa的顺序,是先从最近的numa节点分配,再按numa距离去找下一个近的numa节点分配,分配过程中是否尝试低水位分配、当指定迁移类型内存不够是否优先从其它numa节点同一迁移类型分配还是由本节点其它迁移类型分配,由vm_area_alloc_pages传入的gfp决定。
最后将分配的一批页逐页映射到init_mm页表的pte上(vmap_pages_range_noflush),实现逻辑地址的连续。

参考

要根据逻辑地址找到对应struct page,或根据struct page找到它的物理地址可以参考:https://blog.csdn.net/qq_37517281/article/details/134713650

一个问题

逻辑上连续的内存映射为物理上不连续内存,相对会比逻辑和物理都连续的内存,会造成更多tlb抖动吗?没学过这个,不知道答案

相关推荐

  1. linux vmalloc实现简述

    2023-12-06 12:26:04       58 阅读
  2. Linux的ps简单实现

    2023-12-06 12:26:04       56 阅读
  3. transformerselfattention简单实现

    2023-12-06 12:26:04       42 阅读
  4. 12. C++ kmalloc、kzalloc、vmalloc的区别

    2023-12-06 12:26:04       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 12:26:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 12:26:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 12:26:04       82 阅读
  4. Python语言-面向对象

    2023-12-06 12:26:04       91 阅读

热门阅读

  1. 6、Broker消息处理流程(六)

    2023-12-06 12:26:04       49 阅读
  2. Hadoop学习笔记(HDP)-Part.01 关于HDP

    2023-12-06 12:26:04       54 阅读
  3. 云架构的思考1--云计算有什么不同,为什么上云

    2023-12-06 12:26:04       55 阅读
  4. pytorch学习3-torchvisin和Dataloader的使用

    2023-12-06 12:26:04       57 阅读
  5. Linux 环境部署RabbitMQ

    2023-12-06 12:26:04       63 阅读
  6. Redux,react-redux,dva,RTK

    2023-12-06 12:26:04       59 阅读
  7. 【蓝桥杯】马的遍历

    2023-12-06 12:26:04       29 阅读
  8. Spring Boot项目Service类单元测试自动生成

    2023-12-06 12:26:04       49 阅读