《深入Linux内核架构》第3章 内存管理(6)

目录

3.5.7 内核中不连续页的分配

3.5.8 内核映射


本专栏文章将有70篇左右,欢迎+关注,订阅后续文章。

本节讲解vmalloc, vmap,kmap原理。

3.5.7 内核中不连续页的分配

kmalloc函数:分配物理地址和虚拟地址都连续的内存。

        kmalloc基于slab,而slab基于伙伴系统。

void *vmalloc(unsigned long size);

        介绍:

                分配一大片连续虚拟内存,但其物理地址不一定连续。

        使用场景:

                需要分配很大一块内存。如模块加载时。

        优点:

                更有效利用内存,减少内存分配失败。

        缺点:

                但TLB表项增多,TLB cache miss增加。

        应用进程使用的内存:通常不要求物理连续。

vmalloc分配的虚拟内存如下图:

vmalloc区域之间插入1页安全隙,其没有对应物理页表项。

如果程序无意访问到安全隙时,触发段错误机制。阻止潜在的安全威胁或系统崩溃。

vmalloc函数会生成一个sturct vm_struct实例。用于描述vmalloc分配的区域。

struct vm_struct {

        struct vm_struct         *next;            //连接所有实例,表头为struct vm_struct *vmlist

        void                         *addr;              //起始的虚拟地址。

        unsigned long         size;                 //该区域大小。

        unsigned long         flags;

        struct page              **pages;           //指向page数组,映射源自哪些物理页。

        unsigned int            nr_pages;         //包含有多少个物理页。

        phys_addr_t           phys_addr;         //ioremap使用,其物理地址。

        const void              *caller;

};

flags:

        VA_ALLOC:表示该区域由vmalloc函数建立。

        VA_MAP:表示该区域由vmap函数建立。

        VM_IOREMAP:表示该区域由ioremap函数建立。

vmap,ioremap,vmalloc三个函数:

        1. 都用于建立物理地址非连续的映射。

        2. 都会生成一个struct vm_struct实例,用flag成员区别。

全局变量struct vm_struct *vmlist链表头,链接所有vm_struct。

分配内存

vmalloc实现:

get_vm_area_node:

        创建vm_struct实例,并分配虚拟内存。

__vmalloc_area_node:

        分配对应物理页。

        初始化vm_struct的pages,nr_pages成员。

        调用map_vm_area:将分散物理页映射到连续虚拟空间。

vmalloc的实现中使用了__GFP_HIGHMEM:

        表示尽可能从ZONE_HIGHMEM分配页。

当分配页后,应从对应节点伙伴系统中移除。

其他映射方法

下面函数也可创建虚拟连续的映射:

        vmalloc_32:

                分配的物理内存总是可以用32位指针寻址。

        vmap函数:

                将一个page数组映射到连续虚拟地址空间。

                该函数不分配页,需提前分配好。

                用VM_MAP标识。

        ioremap:

                体系架构自己实现。将硬件IO空间映射到内核空间。

                用VM_IOREMAP标识,驱动中多使用。

释放内存

vfree:

        释放vmalloc,vmalloc_32分配的内存。

        将页返回伙伴系统。

vunmap:

        释放vmap,ioremap创建的映射。

        不会将页返回伙伴系统。

上述两个函数最终都调用__vunmap

3.5.8 内核映射

除vmalloc,其他将ZONE_HIGHMEM域到内核空间的方式:

永久内核映射(pkmap):

        pkmap:Permanent Kernel MAPping。

        作用:为指定高端内存页创建永久映射到内核空间,直到手动解除映射。

        内核空间范围:

                PKMAP_BASE - FIXADDR_START区域

创建一个永久内核映射:

        void *kmap(struct page *page)

        {

                if (!PageHighMem(page))

                        return page_address(page); 没有高端内存时,简单的将页转换为虚拟地址。

        

                return kmap_high(page);

        }

解除永久映射:

        void kunmap(struct page *page)

                内容:解除映射,删除页表,刷出TLB。

过多kmap映射可能导致内存碎片和性能问题。

避免频繁使用kmap。

kmap和vmap区别:

        kmap:单页的映射。

                短时间的映射。

        vmap:多个页映射。(将一组不连续物理页映射到连续虚拟地址)。

                长时间的映射。

kmap:若pkmap数组没有空闲位置,会睡眠,所以不能在中断中使用。

此时应使用kmap_atomic与kunmap_atomic。

在64位体系架构没有高端内存,此时kmap,kunmap,kmap_atomic,kunmap_atomic函数名一样,但实现不一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB聚合运算符:$type

MongoDB聚合运算符&#xff1a;$type 文章目录 MongoDB聚合运算符&#xff1a;$type语法使用可用的类型 举例 $type聚合运算符用来返回指定参数的BSON类型的字符串。。 语法 { $type: <expression> }<expression>可以是任何合法的表达式。 使用 不像查询操作符$…

Selenium + Pytest自动化测试框架实战(上)

前言 今天呢笔者想和大家来聊聊selenium自动化 pytest测试框架&#xff0c;在这篇文章里你需要知道一定的python基础——至少明白类与对象&#xff0c;封装继承&#xff1b;一定的selenium基础。这篇文章不会selenium&#xff0c;不会的可以自己去看selenium中文翻译网哟。 一…

六西格玛管理培训公司:事业进阶的充电站,助你冲破职场天花板!

六西格玛&#xff0c;源于制造业&#xff0c;却不仅仅局限于制造业。它是一种以数据为基础、以顾客为中心、以流程优化为手段的全面质量管理方法。通过六西格玛管理&#xff0c;企业可以系统性地识别并解决运营过程中的问题&#xff0c;提高产品和服务的质量&#xff0c;降低成…

导航app为什么知道还有几秒变绿灯?

在使用地图导航app行驶至信号灯的交叉路口时&#xff0c;这些应用程序会贴心地告知用户距信号灯变化还有多少秒&#xff0c;无论是即将转为绿灯还是红灯。这一智能化提示不仅使得驾驶员能适时做好起步或刹车的准备&#xff0c;有效缓解了因等待时间不确定而产生的焦虑情绪&…

GBPC2510-ASEMI工业电源专用GBPC2510

编辑&#xff1a;ll GBPC2510-ASEMI工业电源专用GBPC2510 型号&#xff1a;GBPC2510 品牌&#xff1a;ASEMI 封装&#xff1a;GBPC-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;25A 功率(Pd)&#xff1a;中小功率 芯片个数&#x…

分布式锁之RedissonLock

什么是Redisson&#xff1f; 俗话说他就是看门狗&#xff0c;看门狗机制是一种用于保持Redis连接活跃性的方法&#xff0c;通常用于分布式锁的场景。看门狗的工作原理是&#xff1a;当客户端获取到锁之后&#xff0c;会对Redis中的一个特定的键设置一个有限的过期时间&#xff…

[附源码]传世手游_玲珑传世_GM_安卓搭建教程

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了。 如果你是小白也没…

C++ 509. 斐波那契数

文章目录 一、题目描述二、参考代码 一、题目描述 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;1 解释&#xff1a;F(2) F(1) F(0) 1 0 1 示例 2&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;2 解释&#xff1a;F(3) F(2) F(1) 1 1 2 示例 3…

设计模式——访问者模式(Visitor)

访问者模式&#xff08;Visitor Pattern&#xff09;是一种将数据操作与数据结构分离的设计模式。这种模式适用于数据结构相对稳定&#xff0c;而操作算法经常改变的情况。访问者模式将数据结构&#xff08;稳定的部分&#xff09;中的元素&#xff08;Element&#xff09;的访…

C语言题目:一元二次方程

题目描述 解一元二次方程ax^2bxc0的解。 输入格式 a,b,c的值。 输出格式 输出两个解&#xff0c;按照大小顺序输出&#xff0c;一个解时需要打印两次&#xff0c;不用考虑无解问题&#xff0c;保留两位小数 样例输入 1 5 -2样例输出 0.37 -5.37 代码解析 首先&#xff0…

了解进程和线程

一、进程和线程 类比&#xff1a; 一个工厂&#xff0c;至少有一个车间&#xff0c;一个车间中至少有一个工人&#xff0c;最终是工人在工作。 一个程序&#xff0c;至少有一个进程&#xff0c;一个进程中至少有一个线程&#xff0c;最终是线程在工作。 进程&#xff1a;是计…

C#正则表达式,提取信息使用

正则表达式简介 在C#中&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;通常简写为regex或regexp&#xff09;是一种功能强大的文本处理工具&#xff0c;它使用特定的字符序列来定义搜索模式&#xff0c;从而实现对文本的高效搜索、匹配和替换操作。正则表达…

乡村振兴与乡村旅游深度融合:依托乡村自然和文化资源,发展乡村旅游产业,促进农民增收致富,打造特色美丽乡村

目录 一、引言 二、乡村振兴与乡村旅游的内在联系 三、依托乡村自然和文化资源发展乡村旅游产业 &#xff08;一&#xff09;挖掘乡村自然资源优势&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘乡村文化资源内涵&#xff0c;丰富旅游活动内容 四、促进农…

新手做视频号电商,做什么样的产品好卖?适合不会选类目的新手看

大家好&#xff0c;我是电商花花&#xff0c;专注做电商的花花。 视频号现在的发展可以说是非常好的&#xff0c;拥有着空前的市场和流量&#xff0c;随着视频号小店新项目对电商的冲击&#xff0c;让更多创业者和新手商家开始涌入视频号电商的行列。 想要在新项目中抢占流量…

【客户案例】禅道软件助力长虹新网实现研发项目管理创新

四川长虹新网科技有限责任公司&#xff08;以下简称长虹新网&#xff09;深耕全球运营商市场二十多年&#xff0c;具备行业领先的软硬件研发、制造、全球化市场营销能力&#xff0c;持续服务国内外200多家主流电信及广电运营商、垂直行业服务商&#xff0c;与合作伙伴共同成长。…

Windows11系统安装Mysql8之后,启动服务net start mysql报错“服务没有响应控制功能”的解决办法

问题 系统环境&#xff1a;Windows11 数据库版本&#xff1a;Mysql8 双击安装&#xff0c;一路下一步&#xff0c;完成&#xff0c;很顺利&#xff0c;但是开启服务后 net start mysql 报错&#xff1a; 服务没有响应控制功能。 请键入 NET HELPMSG 2186 以获得更多的帮助 不…

【项目001】运维工程师项目实践:高可用性云基础设施部署与升级项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 1、什么是ELK&#xff1f; 2、什么是Elasticsearch、Logstash 和Kibana&#xff1f; 3、ELK 三…

echarts树图 改文本显示的地方的样式

树图改文本显示的时候的样式 虽然有点越改越丑 其中有一些失败的尝试 forammter 无法识别html元素 所以对于tooptips有用的html元素定义获取返回在这里写的话是不生效的 rich配置项里面的backgroundColor官方说支持 html元素和canvas元素 已经图片url 没有详细试验 官网地址 h…

【chisel】如何用chisel写一个上升沿检测程序

自定义上升沿检测 class RisingEdgeDetector extends Module {val io IO(new Bundle {val inSig Input(Bool())val outSig Output(Bool())val clock Input(Clock())})// 定义 risingedge 函数def risingedge(x: Bool): Bool x && !RegNext(x)// 使用 risingedge …

代码签名证书的重要作用及申请途径

代码签名技术是一种确保软件完整性和来源可信度的安全措施。它通过数字证书和加密算法为软件代码或可执行文件加上一个“签名”&#xff0c;以此验证软件未被篡改&#xff0c;并确认其来源于可信赖的开发者。 一、代码签名证书的重要作用 1、提高下载率和安装率&#xff1a;用…