《深入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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

GBPC2510-ASEMI工业电源专用GBPC2510

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

分布式锁之RedissonLock

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

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

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

了解进程和线程

一、进程和线程 类比: 一个工厂,至少有一个车间,一个车间中至少有一个工人,最终是工人在工作。 一个程序,至少有一个进程,一个进程中至少有一个线程,最终是线程在工作。 进程:是计…

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

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

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

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

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

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

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

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

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

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

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

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

Linux提权--Rsync(未授权访问) Docker 组挂载

免责声明:本文仅做技术学习与交流... 目录 Rsync(未授权访问) 介绍: 靶场及过程: 提权过程: Docker 组挂载 原理: 复现: 利用: 具体操作: 1-确定是否有docker服务 2-查看用户是否在docker组里面 3-执行命…

包管理工具npm、cnpm、yarn、NVM

文章目录 npmnpm基本使用npm搜索包生产环境与开发环境开发依赖与生产依赖全局安装环境变量Path安装包依赖安装指定版本的包、删除依赖配置命令别名 cnpm安装操作命令:配置 yarnyarn安装及常用命令yarn 配置淘宝镜像 NVM使用常用命令 扩展内容npm和yarn的选择npm发布…

USB转串口芯片CH341、CH372、CH374、CH375等的电路及 PCB 设计的重要注意事项

前言 USB芯片的电路和PCB设计参考及注意事项,含CH34X、CH37X等系列芯片的电路设计说明。涉及工作稳定性和抗干扰以及USB-HOST带电热插拔。基于 USB 芯片的电路及 PCB 设计的重要注意事项 版本:2E 1、摘要 本文主要针对以下因电路及 PCB 设计不佳而引起…

文档解析与向量化技术加速多模态大模型训练与应用

前言 随着人工智能技术的不断发展,多模态大模型作为一种新型的机器学习技术,逐渐成为人工智能领域的热点话题。多模态大模型能够处理多种媒体数据,如文本、图像、音频和视频等,并通过学习不同模态之间的关联,实现更加…

Q1咖啡机行业线上市场(京东天猫淘宝)销售数据分析

回顾疫情那几年,咖啡机市场可能是大环境带动下爆发飞速的品类之一。在整体厨房小家电大盘销售不佳的情况下, 咖啡机市场的表现是亮眼的。而今年Q1季度,在厨卫小电市场整体低迷的状态下,咖啡机市场依然保持着稳中向好的趋势。 根据…

树莓派|连接CSI接口摄像头+opencv

CSI(Camera Serial Interface)接口摄像头是一种常见的嵌入式系统或移动设备中使用的摄像头接口。它通常用于与处理器或图像传感器进行直接连接,实现高速的图像数据传输。 CSI接口摄像头具有以下特点: 高速传输:CSI接口…

Spring MVC(五) 文件上传

1 单文件上传 在程序开发中,有时候需要上传一些文件。我们在学习Servlet的时候,也做过文件上传的操作,只不过基于Servlet的文件上传操作起来过于复杂,因此所有的MVC框架都提供了自己的文件上传操作,基本上都是基于File…