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

linux内核 - vmalloc 介绍

一:概述  

        vmalloc 是内核中的一个分配器。它返回的内存 在虚拟地址空间中是连续的,但底层的物理页帧是分散的。

        vmalloc分配的内存在物理上并不连续。此外, vmalloc 返回的内存总是来自 HIGH_MEM 区域。返回的地址是 纯虚拟地址(而非逻辑地址),无法直接转换为物理地址或总线地址,因为无法保证其对应的物理内存是连续的。

        这意味着,vmalloc() 返回的内存 不能在微处理器之外使用(例如,不能直接用于 DMA 操作)。vmalloc() 适合用于分配 存在于软件中的大块连续页序列(例如网络缓冲区),而不是仅仅分配一页内存。

        需要注意的是,vmalloc() 比 kmalloc() 和页分配器函数慢,因为它不仅要获取内存,还需要建立页表,甚至可能重新映射为虚拟连续区域,而 kmalloc() 则无需执行这些操作。

        vmalloc() 会分配 非连续的物理页,并将它们映射到 连续的虚拟地址区域。这些 vmalloc 的虚拟地址位于 内核空间的一定区域内,由 VMALLOC_START 和 VMALLOC_END 限定,这两个值依赖于具体的体系结构。

        内核提供了 /proc/vmallocinfo 文件,用于显示系统中 所有通过 vmalloc 分配的内存。

二:相关函数和示例

#include <linux/vmalloc.h>void *vmalloc(unsigned long size);
void *vzalloc(unsigned long size);
void vfree(void *addr);
#include <linux/init.h>
#include <linux/module.h>
#include <linux/vmalloc.h>
#include <linux/kernel.h>
#include <linux/string.h>  // for memsetstatic void *ptr;  // 静态指针用于保存 vmalloc 地址
#define ALLOC_SIZE 8192  // 分配 2 x 4KB 内存static int __init my_vmalloc_init(void)
{pr_info("Initializing vmalloc example module\n");// 分配内存ptr = vmalloc(ALLOC_SIZE);if (!ptr) {pr_err("Memory allocation failed\n");return -ENOMEM;}// 初始化内存memset(ptr, 0, ALLOC_SIZE);pr_info("Memory allocated successfully at virtual address %p\n", ptr);return 0;
}static void __exit my_vmalloc_exit(void)
{if (ptr) {vfree(ptr);pr_info("Memory freed\n");}
}module_init(my_vmalloc_init);
module_exit(my_vmalloc_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("your_email@example.com");
MODULE_DESCRIPTION("A simple vmalloc() example kernel module");

http://www.dtcms.com/a/347197.html

相关文章:

  • Unity 字符串输出文字一样但Equals 判断为false
  • 图论与最短路学习笔记
  • CH2 线性表
  • LeetCode 分类刷题:2529. 正整数和负整数的最大计数
  • IDEA控制台乱码(Tomcat)解决方法
  • 2-4.Python 编码基础 - 流程控制(判断语句、循环语句、break 语句与 continue 语句)
  • MySQL存储过程详解
  • `strlen` 字符串长度函数
  • GEO优化服务:智能时代的全球竞争新赛道
  • VS Code 中创建和开发 Spring Boot 项目
  • python企微发私信
  • Text2API与Text2SQL深度对比:自然语言驱动的数据交互革命
  • 【40页PPT】数据安全动态数据脱敏解决方案(附下载方式)
  • C/C++ 头文件命名约定
  • stack,queue以及deque的介绍
  • 【Java学习笔记】18.反射与注解的应用
  • [e3nn] 模型部署 | TorchScript JIT | `@compile_mode`装饰器 | Cython
  • TypeScript的构造函数constructor用法理解
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第四章知识点问答补充及重新排版
  • 离线优先与冲突解决:ABP vNext + PWA 的边缘同步
  • SQL Server更改日志模式:操作指南与最佳实践!
  • 使用 Certbot 申请 Apache 证书配置棘手问题
  • UAD详解
  • 分库分表系列-核心内容
  • 知识蒸馏 Knowledge Distillation 概率链式法则(Probability Chain Rule)
  • Class42时序模型
  • 深度学习开篇
  • 【通俗易懂】TypeScript 的类型守卫 (Type Guards)作用理解
  • iperf2 vs iperf3:UDP 发包逻辑差异与常见问题
  • [新启航]白光干涉仪与激光干涉仪的区别及应用解析