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

  目录

3.5.7 内核中不连续页的分配

3.5.8 内核映射


本节讲解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.hqwc.cn/news/589910.html

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

相关文章

5.Python数据分析—Pandas数据结构详讲

5.Python数据分析—Pandas数据结构详讲 摘要个人简介简介Series定义和特点创建方法属性和方法 DataFrame定义和特点创建方法数据获取和操作 索引对象种类和应用作用和管理 摘要 Pandas是一个开源的Python数据分析库,提供了高性能、易用的数据结构和数据分析工具。它…

大屏可视化项目示例--基于Vue3+vite2+echart+mock+axios+dataV

图例: 项目环境: Vite、Echarts、Npm、Node、axios、mock、vue3、dataV。 项目地址: IofTV-Screen-Vue3: 🔥(IofTV-Screen Vue3版本)一个基于 vue3、vite、Echart 框架的物联网可视化(大屏展示)模板&…

php运行python脚本失败怎么解决

假设有文件:php_test.php python_test.py 在php文件中运行Python: exec("python python_test.py", $array, $ret); 如果运行Python出错并不能保存在数组array中,因此应该把标准错误重定向到文件中,以上代码改写如下&a…

YOLOv2

YOLOv2 论文介绍论文改进1. Batch Normalization2. High Resolution Classifier3. Convolutional With Anchor Boxes4. vgg16换成darknet-195. Dimension Clusters(w h的聚类)6 预测坐标7. passthrough8. 多尺度输入训练 损失函数 论文介绍 论文名字&am…

SSM项目转Springboot项目

SSM项目转Springboot项目 由于几年前写的一个ssm项目想转成springboot项目,所以今天倒腾了一下。 最近有人需要毕业设计转换一下,所以我有时间的话可以有偿帮忙转换,需要的私信我或+v:Arousala_ 首先创建一个新的spr…

波士顿房价预测案例(python scikit-learn)---多元线性回归(多角度实验分析)

波士顿房价预测案例(python scikit-learn)—多元线性回归(多角度实验分析) 这次实验,我们主要从以下几个方面介绍: 一、相关框架介绍 二、数据集介绍 三、实验结果-优化算法对比实验,数据标准化对比实验&#xff0…

标题:巨控GRM560:医药行业设备管理的预警的革新者

描述:在快速发展的医药行业中,设备的稳定性和安全性至关重要。巨控GRM560模块作为一种前沿的数据采集和故障提醒系统,已经成为该行业内不可或缺的一部分。本文将深入探讨GRM560模块的功能及其在医药行业中的应用。 正文: 在当今…

29.使线程以固定顺序输出结果

借助wait和notify方法控制线程以固定的顺序执行: /*** 控制输出字符的顺序,必须是固定顺序2,1* 采用wait-notify实现* param args*/public static void main(String[] args) {new Thread(() -> {synchronized (lock) {while (!isPrint2) {try {lock.…

【漏洞复现】科立讯指挥调度管理平台存在命令注入漏洞

0x01 产品简介 科立讯指挥调度管理平台是一个专业针对通信行业的管理平台。该产品旨在提供高效的指挥调度喝管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任务等。用…

C语言:文件操作(一)

目录 前言 1、为什么使用文件 2、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 结(一) 前言 本篇文章将介绍C语言的文件操作,在后面的内容讲到:为什么使用文…

C++的并发世界(五)——线程状态切换

0.线程状态 初始化:该线程正在被创建; 就绪:该线程在列表中就绪,等待CPU调度; 运行:该线程正在运行; 阻塞:该线程被阻塞挂机,Blocked状态包括:pend&#xff…

Apache DolphinScheduler 【安装部署】

前言 今天来学习一下 DolphinScheduler ,这是一个任务调度工具,现在用的比较火爆。 1、安装部署 1.0、准备工作 1.0.1、集群规划 dolphinscheduler 比较吃内存,所以尽量给 master 节点多分配一点内存,桌面和虚拟机里能关的应用…