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

embedded/2024/9/19 13:17:23/ 标签: linux

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 架构,跨平台集成对于使…

C++入门基础知识75(高级)——【关于C++ Web 编程】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C Web 编程的相关内容&#xff01; 关于…

笔记:简介Drawing是什么,都有哪些,如何使用

一、目的&#xff1a;Drawing简介 在 WPF 中&#xff0c;Drawing 是一个抽象基类&#xff0c;用于表示可绘制的对象。Drawing 类及其派生类提供了一种轻量级的方式来描述图形、图像和视频等内容。Drawing 对象通常用于不需要用户交互的静态内容&#xff0c;例如背景图像、图标和…

java生成随机数的四种方法

方法一&#xff1a;Math.random() Math.random() 方法返回的是一个介于 0.0&#xff08;包含&#xff09;和 1.0&#xff08;不包含&#xff09;之间的随机浮点数。 1、生成0.0到1.0之间的浮点数:double f Math.random(); 2、生成0.0到50.0之间的双精度浮点数:double rando…

如何训练机器学习力场

机器学习力场&#xff08;MLFF&#xff09;的训练主要依赖于通过量子力学计算生成的高质量训练数据集&#xff0c;并利用不同的机器学习算法来拟合分子系统中的势能面&#xff08;Potential Energy Surface, PES&#xff09;和原子间作用力。这种训练过程包括数据准备、特征提取…

数据结构:堆的算法

目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点&#xff08;父结点进行比较&#xff09;&#xff0c;继而进行交换&#xff0c;完成二叉树的结构&#xff0…

【CS110L】Rust语言 Lecture3-4 笔记

文章目录 第三讲 所有权:移动与借用&例1例2例3 错误处理&#xff08;开头&#xff09;为什么空指针如此危险&#xff0c;我们能做什么以应对&#xff1f;— 引出Optionis_none()函数unwrap_or()函数常见用法 第四讲 代码实践:链表Box节点和链表的定义节点和链表的构造函数判…

SQL Server数据库简单的事务日志备份恢复

模拟数据库备份恢复过程 1.基础操作 1.创建TestDB数据库&#xff0c;并添加数据 USE [master] GO CREATE DATABASE TestDB CONTAINMENT NONE ON PRIMARY ( NAME NTestDB, FILENAME ND:\TestDB.mdf , SIZE 8192KB , MAXSIZE UNLIMITED, FILEGROWTH 65536KB ) LOG ON ( …

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

【数据结构】排序算法---快速排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 递归版本代码实现5.1 hoare版本5.2 挖坑法5.3 lomuto前后指针 6. 优化7. 非递归版本代码实现结语 1. 定义 快速排序是由东尼霍尔所发展的一种排序算法。在平均状况下&#xff0c;排序 n 个项目要 O ( n l o g n ) Ο(nlogn) …

C++——判断year是不是闰年。

没注释的源代码 #include <iostream> using namespace std; void Y(int y); int main() { int year; cout<<"请输入一个年份:"; cin>>year; Y(year); return 0; } void Y(int y) { if(((y%40)&&(y%100!0))||(y%…

人工智能开发实战matplotlib库应用基础

内容导读 matplotlib简介绘制直方图绘制撒点图 一、matplotlib简介 matplotlib是一个Python 2D绘图库&#xff0c;它以多种硬拷贝格式和跨平台的交互式环境生成高质量的图形。 matplotlib 尝试使容易的事情变得更容易&#xff0c;使困难的事情变得可能。 我们只需几行代码…

前端vue中如何给reactive赋值

const deviceDatareactive({}) const getDeviceDetail (list)>{ if(list.length > 0){ for(let item of list){ if(item.id param.id){ Object.assign(deviceData,item) } } } }