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

相关推荐
woniu_buhui_fei13 小时前
日常工作常用的命令(Linux+JDK)
linux·运维·服务器
coward9113 小时前
全志T507 (sun50iw9p1)sunxi pinctrl 子系统实现分析
linux·嵌入式硬件
OnlineProxy13 小时前
如何在无需手机号的情况下创建 Google 账号:高信任度代理(High Trust Score Proxy)如何取代短信验证
运维·服务器·facebook
imaol113 小时前
文件编程--标准IO
linux·运维·算法
王坊兴14 小时前
Ubuntu 部署产品原型静态服务器:SFTP + Nginx
服务器·nginx·ubuntu
旗开得胜马到成功14 小时前
AMD TPM 8.3/8.5漏洞技术剖析:服务器加密信任根崩塌后的备份密钥泄露风险与紧急加固
运维·服务器·网络·系统架构
guanchabao14 小时前
三相63A与端口级遥调并行:2026年AI服务器老化测试专用PDU的选型路径
服务器
我是小灰灰吖14 小时前
解决高频率图像处理中的内存“只增不减”:glibc malloc_trim实战指南
linux·qt
小嵌同学14 小时前
Linux 内核中断处理机制详解:上半部、下半部与延迟执行策略
linux·嵌入式·bsp
breeze jiang15 小时前
TypeScript 工具类型怎么记:从 Pick、Omit 到 keyof 与 Exclude 推导
linux·ubuntu·typescript