03_013内存分配api以及页表详解

news2024/11/26 16:31:39

前言

之前文章中物理ram中的最小单位一直用页来表示
这次又描述的详细了点
物理ram的最小单位 有的地方叫 块,框,页帧 在虚拟空间中最小单位也叫页 需要好好区分
不过后来想想管你虚拟页还是物理ram页 都存在物理ram上 都能想成一 一对应的关系 所以大家都叫页好像也行

内存分配接口

linux内核中有很多分配内存的接口傻傻分不清 下面总结一下每个的作用

用户空间使用(malloc/calloc/realloc/free)

用户空间(malloc/calloc/realloc/free) 。不保证物理连续。大小限制(堆申请)。单位为字节。
场景: calloc初始化为0,realloc改变内存 大小。
mmap/munmap。场景:将文件利用虚拟内存技术映射到用户空间内存当中。
brk/sbrk。场景:虚拟内存到内存的映射。

内核空间(vmalloc/vfree)

内核空间(vmalloc/vfree) 。虚拟连续/物理不连续。大小限制(vmalloc区) 单位为页(vmalloc区域)。
场景:可能睡眠,不能从中断上下文中调用,或其他不允许阻塞情况下调用。
void *vmalloc(unsigned long size);
分配不连续的物理页并且把物理页映射到连续的虚拟地址空间;
void vfree (const void * addr);
释放vmalloc分配的物理页和虚拟地址空间; .
void *vmap(struct type **pages,unsigned int count,unsigned long flags,pgprot t prot);
把已经分配的不连续物理而映射到连续的虚拟地址空间;
void vunmap(const void *addr);
释放使用vmap分配的虚拟地址空间。

slab分配器常用(kmalloc/kcalloc/krealloc/kfree) 。物理连续。大小限制(64b–4mb) 。单位为2^order字节(Normal区域)。
场景:大小有限,不如vmalloc/malloc大。
还有一个叫做kmem_ cache_ create (物理连续。64-4mb。 字节大小需要对齐(Normal区域)。
场景:便于固定大小数据的频繁分配和释放,分配时从缓存池中获取地址,释放时也不一定真正释放内存,通过slab进行管理)。

伙伴系统( get_free_ page | _ get_ free_ pages)。 物理连续。4mb (1024页) ,单位为页(Normal区域)。
场景:get free_ pages,但是限定不能使用HIGHMEM)
alloc_ page/alloc_ pages/free_ pages, 物理连续。4mb,单位为页(Normal/Vmalloc都可以) 。
场景:配置定义最大页面数2^11, -次能分配到的最大页面数是1024。

页表

页表作用把虚拟页映射到物理页

虚拟地址

在LINUX系统下,虚拟地址空间实际上是一个 mm_struct的结构体,是对一块内存空间的描述,通过这个描述向进程虚拟出一个连续的,完整的内存空间。
在这里插入图片描述

为什么要虚拟地址

为了让进程不直接访问物理内存
如过进程直接访问物理内存:
1.进程中的代码数据使用的是连续的地址空间,如果直接使用连续的物理内存会造成内存浪费。
2.在物理内存上任何区域和位置都能可读可写 直接访问物理内存会因为缺乏内存访问控制而导致进程的不安全

虚拟内存物理ram内存映射图

每个进程都有自己的页表数据都在物理内存上
Cpu在执行对应的进程时候都会访问相对的内存 cpu不会直接访问物理内存
而是通过虚拟地址空间 间接访问物理地址 ,操作系统给每个进程分配的逻辑地址(cpu使用的地址)
比如在32位机器上 虚拟地址空间就是0~4G 操作系统把虚拟地址空间和物理地址空间建立映射
让cpu间接访问物理地址 通常在虚拟地址空间中 512字节到8k为一个单位称为页
在这里插入图片描述
CPU并不是直接访问物理内存地址,而是通过虚拟地址空间来间接的访问物理内存地址。
虚拟地址空间是操作系统为每个正在执行的进程分配一个逻辑地址,比如在32位系统,范围0~4G-1。
操作系统通过将虚拟地址空间和物理内存地址之间建立映射关系,让CPU能够间接访问物理内存地址。
一般情况将虚拟地址空间以512byte-8K, 作为-个单位,称为页,并从0开始依次对它进行页编号。
这个大小就称为页面。将物理地址按照同样大小,作为一个单位,称为框或者是块。
也从0开始依次进行对每个框编号。操作系统通过维护一张表,这张表记录每一对页和框的映射关系。windows系统页面大小为4KB。
在这里插入图片描述
系统为每个进程建立一个页表,在进程逻辑地址空间中每一页,依次在页表中有一个表项,
记录该页对应的物理块号。
通过查找页表就可以很容易地找到该页在内存中的位置。页表具有逻辑地址到物理地址映射作用。

ARM64处理器页表

Linux内核把页表直接分为4级:
页全局目录(PGD)、
页上层目录(PUD) 、
页中间目录(PMD)、
直接页表(PT)。
如果选择三级(页全局目录、页中间目录、直接页表)。
如果选择二_级(页全局目录和直接页表)。
五级页表的结构,每个进程有独立的页表,进程的mm_struct实例成员pgd指向页全局目录。
前面四级页表的表项存放下一-级页表的起始地址,直接页表的表项存放页帧号(PFN)

在这里插入图片描述
查询页表,把虚拟地址转换成物理地址流程:
1、根据页全局目录的起始地址和页全局目录索弓|得到页全局目录表项的地址,然后再从表项得到页四级目录的起
始地址;
2、根据页四级目录的起始地址和页四级目录索引|得到页四级目录表项的地址,然后从表项得到页上层目录的起始
地址;
3、根据页上层目录的起始地址和页上层目录索引|得到页上层目录表项的地址,然后从表项得到页中间目录的起始
地址;
4、根据页中间目录的起始地址和页中间目录索引|得到页中间目录表项的地址,然后从表项得到直接页表的起始地
址;
5、根据直接页表的起始地址和直接页表索弓|得到页表项的地址,然后从表项得到页帧号;
6、把页帧号和页内偏移组合形成物理地址。

虚拟地址和物理地址如何对应

比如虚拟地址的宽度是48位,页长度和转换表级数关系:
页长度是4KB:使用4级转换表,转换表和内核的页表对应关系。
0级转换表对应面全局目录,1级转换表对应页_上层目录,2级转换表对应页中间目录, 3级转换表对应直接页表。
在这里插入图片描述

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

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

相关文章

【Unity3D】Shader Graph节点

1 前言 Shader Graph 16.0.3 中有 208 个 Node(节点),本文梳理了 Shader Graph 中大部分 Node 的释义,官方介绍详见→Node-Library。 Shader Graph 通过图像的形式表达了顶点变换和片元着色流程,其背后都是一些列的数学…

保持城市天际线(力扣)贪心 JAVA

给你一座由 n x n 个街区组成的城市,每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid ,其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天际线 是从远处观察城市时,所有建筑物形成的外部轮廓。…

【系统架构】分布式系统架构设计

1 分布式系统是什么 分布式系统是指由多个计算机节点组成的一个系统,这些节点通过网络互相连接,并协同工作完成某个任务。 与单个计算机相比,分布式系统具有更高的可扩展性、可靠性和性能等优势,因此广泛应用于大规模数据处理、高…

大数据-玩转数据-Flink 自定义Sink(Mysql)

一、说明 如果Flink没有提供给我们可以直接使用的连接器,那我们如果想将数据存储到我们自己的存储设备中,mysql 的安装使用请参考 mysql-玩转数据-centos7下mysql的安装 创建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

使用日志来监控应用

根据提取规则运行的位置可以分为两类做法,一个是在中心端,一个是在日志端。 中心端就是把要处理的所有机器的日志都统一传到中心,比如通过 Kafka 传输,最终落到 Elasticsearch,指标提取规则可以作为流计算任务插到 Ka…

3.解构赋值

解构赋值是一种快速为变量赋值的简洁语法,本质上仍然是为变量赋值。 3.1数组解构 数组解构是 将数组的单元值快速批量赋值给一系列变量 的简洁语法 1.基本语法: (1)赋值运算符左侧的[ ]用于批量声明变量,右侧数组的单元值将被赋…

免费开源的多种人工智能项目,比如:训练一个模型,让人工智能玩王者荣耀

免费开源的多种人工智能项目,比如:训练一个模型,让人工智能玩王者荣耀。 全文大纲 PULSE - 该开源项目可以通过给图片增加像素点来实现去马赛克或高清化。 Depix - 给打了马赛克的文字去码。 TecoGAN - 给视频去马赛克或者进行超分辨率。 Sk…

python -- 函数闭包

1. LEGB规则 L: local 是局部作用域 E: Enclosed 是嵌套函数的外层函数作用域 G: Global 全局作用域 B:Build-In 内置作用域 变量的使用权重:局部变量 > 外层作用域变量 > 全局变量 > 内置变量 下面代码执行后,x变量的值分别为多少&#xff1…

【JavaEE基础学习打卡03】Java EE 平台有哪些内容?

目录 前言一、Java EE平台说明二、Java EE平台容器及组件1.平台容器2.平台组件 三、JavaEE平台API服务1.API服务概览2.平台API 总结 前言 📜 本系列教程适用于Java Web初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不…

Opencv特征检测之ORB算法原理及应用详解

Opencv特征检测之ORB算法原理及应用详解 特征是图像信息的另一种数字表达形式。一组好的特征对于在指定 任务上的最终表现至关重要。视觉里程 (VO) 的主要问题是如何根据图像特征来估计相机运动。但是,整幅图像用来计算分析通常比较耗时&…

算法通过村第三关-数组基础笔记|爱不起的数组

文章目录 前言线性表的概念什么是线性表从语言实现的角度看从存储的角度看从访问限制的角度看从扩容的角度看数组的概念数组元素的特征 数组的基本操作数组的创建和初始化查找一个元素增加一个元素删除一个元素 总结 前言 提示:孩子们有时候挺伤人的,他…

两个数组的交集-C语言/Java

描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。&#xff08;1 < nums1.length, nums2.length < 1000&#xff0c;0 < nums1[i], nums2[i] < 1000&#xff09; 示例1 输入…

Linux源码剖析匿名共享内存shmem原理

如下问题如果都清楚了就不用看本文了&#xff1a; 1. shmem ram文件系统的初始化流程是怎样的 2. shmem思想上想复用基于文件的操作流程&#xff0c;实现上shmem也引入了一个文件&#xff0c;那么类似文件open会生成struct file&#xff0c;shmem的struct file怎么生成的 3.…

C语言 棱形图案

目录 一、问题分析 上部分&#xff1a; 下部分&#xff1a; 二、代码演示 一、问题分析 如上图所示&#xff0c;我们可以将棱形进行拆解&#xff0c;分为上下两个部分。 上部分&#xff1a; 通过观察&#xff0c;我们得到 单边空格数 上半部分总行数 - 行数 - 1 …

graphab 教程 ——安装

graphab 软件致力于从图论的框架对生态网络进行建模。Graphab是基于图论原理建立生态网络模型的软件,它可以实现景观组分可视化、连通性分析等,且易于与地理信息系统兼容。Graphab 是基于Java平台开发的,可直接在 Windows、Linux,Mac等操作系统中运行,界面友好且易于使用。Grap…

HCIP学习--BGP实验

一、实验拓扑 二、实验需求 除R5的5.5.5.0环回外&#xff0c;其他所有的环回均可互相访问 三、实验步骤 首先配置IP&#xff0c;配置好IBGP 建立直连的EBGP邻居关系 R1和R2建立直连的EBGP邻居关系 [r1]bgp 1 [r1-bgp]router-id 1.1.1.1 [r1-bgp]peer 12.1.1.2 as-number …

MyBatis插件开发

目录 一、项目简单搭建二 、一个接口了、两大注解、四大对象三、脱敏插件开发 一、项目简单搭建 demo结构&#xff0c;已经搭建了无数次了&#xff0c;懒的粘贴了 o(╥﹏╥)o pom文件 <dependency><groupId>org.springframework.boot</groupId><artifa…

AIGC商用实例—大模型技术助力AI测谎仪,实现视频通话实施测谎!

大家好&#xff0c;我是千寻哥&#xff0c;最近一段时间&#xff0c;给大家分享了不少的AI绘画相关的项目教程&#xff0c;很多星友都反映真的不错&#xff0c;我自己也是感觉很有意义&#xff01; 哈哈哈&#xff0c;今天我在看到了一个项目柑感觉是一个不错的idea&#xff0c…

下一代深度学习的思考与若干问题

下一代深度学习的思考和若干问题

OpenCV基本操作——图像的基础操作

目录 图像的IO操作读取图像显示图像保存图像 绘制几何图形绘制直线绘制圆形绘制矩形向图像中添加文字效果展示 获取并修改图像中的像素点获取图像的属性图像通道的拆分与合并色彩空间的改变 图像的IO操作 读取图像 cv2.imread()import numpy as np import cv2 imgcv2.imread(…