内存管理篇-26虚拟内存管理:vmalloc

embedded/2024/11/15 6:05:10/

1.vmalloc分配器的使用:

        vmalloc经常用于申请大块内存。由于kmalloc最大申请内存为4MB,如果想要申请更加大的内存,可以使用vmalloc,大小没有限制,虚拟地址连续,物理地址不一定连续。

        vmalloc区域最小是240MB,这个是内核定义好的。当线性映射区较小时,会把多余的地址分给vmalloc。

        kmalloc(最大申请4MB内存,因为它是直接从伙伴系统中申请内存的,伙伴系统中最大的内存块就是4MB)

        vmalloc:申请的物理页帧是不是连续的,虚拟地址空间是已连续的。

 2.编程实战:

static int __init hello_init(void)
{unsigned int phys_addr;unsigned int pfn;p = vmalloc(5*1024*1024);if(!p){printk("vmalloc fail!\n")}else{for(i=0; i<100; i++){p = p + 1024;//pfn = vmalloc_to_pfn(p);//转换成物理页帧,注意这里不能通过virt_to_phys转成物理地址,因为它是针对线性映射区phys_addr = (pfn << 12) | ((unsigned int)p&&0xff);printk("virt_addr: %x; pfn:%x; phys_addr:%x\n", (unsigned int p), pfn, (unsigned int)phys_addr);}}printk("-------------------------------\n");q = kmalloc(4*1024*1024,GFP_KERNEL);//4MB成功,5MB失败,从线性映射区申请的虚拟内存if(!q){printk("malloc fail\n");} else {for(i=0; i<100; i++){q = q + 1024;phys_addr = virt_to_phys(q);//转换成物理地址pfn = (unsigned long)phys_addr >> 12;printk("virt_addr: %x; pfn:%x; phys_addr:%x\n", (unsigned int p), pfn, (unsigned int)phys_addr);}}
}static void __exit hello_exit(void)
{vfree(p);kfree(q);
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICESE("GPL";)
MODULE_DESCRIPTION("kmalloc/kfree demo");

3.内核源码解析vmalloc分配器

        在内核层面,每次通过vmalloc申请一片区域,都会通过vmap_area结构体描述。申请的每个区域都会放到一个链表上和红黑树上(struct list_head list; struct rb_node rb_node;)vm_struct表示当前映射的区域。

 


http://www.ppmy.cn/embedded/113811.html

相关文章

2024.9.14 Python与图像处理新国大EE5731课程大作业,马尔可夫随机场和二值图割,校正立体图像的深度

1.马尔科夫随机场和二值图割 马尔可夫随机场&#xff08;MRF, Markov Random Field&#xff09;&#xff1a; MRF 是一种用来描述图像像素之间空间关系的概率模型。它假设图像中的像素不仅取决于自身的值&#xff0c;还与周围像素有关。这种模型经常用于图像分割、去噪等任务。…

Shell篇之编写MySQL启动脚本

Shell篇之编写MySQL启动脚本 1. 脚本内容 vim mysql_ctl.sh#!/bin/bashmysql_port3306 mysql_username"root" mysql_password"molinker" mysql_conf"/opt/lanmp/mysql/etc/my.cnf" mysql_sock"/opt/lanmp/mysql/var/mysql.sock"func…

贪心算法day29|134. 加油站(理解有难度)、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列

贪心算法day29|134. 加油站&#xff08;理解有难度&#xff09;、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列 134. 加油站暴力非暴力 135. 分发糖果860. 柠檬水找零1.哈希表2.直接法 406. 根据身高重建队列 134. 加油站 在一条环路上有 n 个加油站&#xff0c;其…

vscode配置c/c++环境

在 Visual Studio Code (VSCode) 中配置 C/C 开发环境需要几个步骤。以下是详细的步骤指南&#xff0c;包括安装必要的扩展、配置编译器和调试器等。 安装 VSCode 首先&#xff0c;确保你已经安装了 Visual Studio Code。可以从 VSCode 官网 下载并安装。 安装 C/C 扩展 打开 …

【重学 MySQL】三十三、流程控制函数

【重学 MySQL】三十三、流程控制函数 IF函数IFNULL函数CASE函数总结 在MySQL中&#xff0c;流程控制函数是用于在SQL查询、存储过程或函数中根据特定条件执行不同流程的重要工具。这些函数可以帮助我们实现复杂的逻辑判断和数据转换。 IF函数 IF函数是MySQL中最基本的流程控制…

django orm查询优化

DJANGO ORM查询优化 Django ORM 提供了一些优化查询的工具&#xff0c;可以减少数据库查询次数和提高查询性能。常见的优化手段包括使用 select_related、prefetch_related、defer 和 only 等。 1. select_related 优化外键查询 select_related 用于一对一和一对多关系的优化…

函数题 6-10 阶乘计算升级版【PAT】

文章目录 题目函数接口定义裁判测试程序样例输入样例输出样例 题解解题思路完整代码AC代码 编程练习题目集目录 题目 要求实现一个打印非负整数阶乘的函数。 函数接口定义 void Print_Factorial ( const int N ); 其中N是用户传入的参数&#xff0c;其值不超过 1000 1000 10…

跨平台集成:在 AI、微服务和 Azure 云之间实现无缝工作流

跨平台集成在现代 IT 架构中的重要性 随着数字化转型的不断加速,对集成各种技术平台的需求也在快速增长。在当今的数字世界中,组织在复杂的环境中执行运营,其中多种技术需要无缝协作。环境的复杂性可能取决于业务的性质和组织提供的服务。具体到 IT 架构,跨平台集成对于使…