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抖动吗?没学过这个,不知道答案

相关推荐
远牧6 分钟前
Ubuntu 26 升级踩坑实录:hermes-agent venv 重建全过程
linux·ubuntu·ai·agent
新时代牛马7 分钟前
Linux PREEMPT_RT 详解(5.10.268-rt164)
linux·运维·服务器
眼不痛请看我8 分钟前
Ubuntu_22.04_LTS虚拟机安装指南
linux·数据库·ubuntu
哎呦,帅小伙哦14 分钟前
查看网卡配置连接工具组合——nmcli + nmtui
linux
xiaoye-duck19 分钟前
《Linux 网络编程》从 0 手写 Reactor 反应堆(上):拆解 Reactor 架构 —— 连接抽象、Poller 封装与事件派发核心
linux·网络
脚踏实地,坚持不懈!20 分钟前
Android 电池健康度检测全流程(驱动 → 内核 → HAL → Framework)
android·linux
IT技术分享社区23 分钟前
在 Windows 上跑未改动的 Linux 程序:微软 LiteBox v0.1 把这件事变简单了
linux·运维·windows·microsoft·开源
Saniffer_SH24 分钟前
【高清视频】一块 SSD,两条 PCIe 链路:Dual-Port NVMe SSD测试环境怎么搭?(一)
服务器·ssd测试·dual-port ssd·企业级ssd测试·dualport·ssd测试环境·dualport ssd测试
一只旭宝34 分钟前
【网络精讲1】TCP 三次握手:为什么是三次,第三次丢了怎么办
服务器·网络·tcp/ip
C++ 老炮儿的技术栈1 小时前
C++ const 的3个核心作用
服务器·c语言·c++·算法·c