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

前言

之前文章中物理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.rhkb.cn/news/88322.html

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

相关文章

服务器安装JDK

三种方法 方法一: 方法二: 首先登录到Oracle官网下载JDK JDK上传到服务器中,记住文件上传的位置是在哪里(我放的位置在/www/java),然后看下面指示进行安装 方法三: 首先登录到Oracle官网下载…

深度学习常用的python库学习笔记

文章目录 数据分析四剑客Numpyndarray数组和标量之间的运算基本的索引和切片数学和统计方法线性代数 PandasMatplotlibPIL 数据分析四剑客 Numpy Numpy中文网 ndarray 数组和标量之间的运算 基本的索引和切片 数学和统计方法 线性代数 Pandas Pandas中文网 Matplotlib Mat…

CSS:服务器字体 与 响应式布局(用法 + 例子 + 效果)

文章目录 服务器字体定义 服务器字体使用例子 响应式布局设备类型设备特性例子 服务器字体 解决字体不一致而产生的。 首先,在网上把字体下载好。 定义 服务器字体 font-face{font-family:字体名称;src:url(字体资源路径); }使用 在需要使用的选择器里加上 font…

【硬件突击 电路】

文章目录 1. 电阻(Resistor):2. 电容(Capacitor):3. 电感:4、 RC、RL、RLC电路结构及工作原理基尔霍夫定律基尔霍夫电流定律(KCL)基尔霍夫电压定律(KVL&#…

❤ VUE3 项目路由拦截器配置(二)

❤ VUE3 项目 路由拦截器进一步 配置 路由拦截抽离为单个模块permission.ts 路由配置规则 白名单(直接进入) PC页面和PC子页面(直接进入) 后台页面(验证token ) 没有token> 后台登录页面 有token> 后…

英码国产高配边缘计算盒子上市!搭载TPU处理器BM1684X,适配麒麟系统,支持OTA升级!

随着人工智能技术不断深入实际应用场景,加速各行各业场景应用落地,边缘计算的重要性越发凸显。相较于传统的集中式云计算,边缘计算在距离数据源或用户更近的地方提供计算能力,不仅满足了对实时性要求较高的场景应用需求&#xff0…

操作指南 | 如何使用Chainlink喂价功能获取价格数据

Chainlink的去中心化预言机网络中的智能合约包含由运行商为其他智能合约(DApps)使用或截取所持续更新的实施价格数据。其中有两个主要架构:喂价和基础要求模型。此教程将会展现如何在Moonbeam、Moonriver或是Moonbase Alpha测试网上使用喂价功…

Flink 火焰图

方式一 使用 Flink Web UI 的 Flame Graph Flink 自己也支持了 Task 粒度的 Flame Graphs 功能,并且可以细化到 subtask 粒度。 第一步:配置启用功能 Flink 作业动态参数里增加配置:“rest.flamegraph.enabled”: “true” 并重启作业。当前该功能没有默认开启,因为这个功…

Redis_哨兵模式

9. 哨兵模式 9.1 简介 当主库宕机,在从库中选择一个,切换为主库。 问题: 主库是否真正宕机?哪一个从库可以作为主库使用?如何实现将新的主库的信息通过给从库和客户端? 9.2 基本流程 哨兵主要任务: 监控选择主库通知 会有…

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球

目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…

UE5、CesiumForUnreal接入WMTS格式地图瓦片,如ArcGIS、Mapbox、天地图

文章目录 1.实现目标2.实现过程2.1 WMTS与TMS2.2 cesium-native改造2.3 CesiumForUnreal插件改造2.4 WMTS瓦片加载测试2.5 EPSG:3857与43263.参考资料1.实现目标 通过改造cesium-native和CesiumForUnreal插件,参考tms的栅格瓦片地图加载逻辑,实现在UE5中通过CesiumForUnreal…

Java中处理表格

大家好 , 我是苏麟 , 也是很久没有更新了 , 今天带来一个很好使用的一个库 easyexcel. JAVA后端开发中可能会遇到一个问题 , 就是处理Execel表格 , 当然不一定非要用Java 我们在这里只说在Java里怎么去处理表格 . Easy Excel 我们今天要说到就是 Easy Excel , 这个是阿里的项…

Unity-Linux部署WebGL项目MIME类型添加

在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载,那么如果咱们做的是商业项目,往往是需要部署在学校或者云服务器上面的,大部分情况下如果项目有接口或者后台管理系统,后台基本都会使用Lin…

idea cannot download sources 解决方法

问题 点击class文件右上角下载源码失败 解决方案 找到idea terminal 控制台cd 至maven工程执行 mvn dependency:resolve -Dclassifiersources

lc137. 只出现一次的数字 II

数组排序,既和前不一样又和后不一样的就是唯一的一个 public static int numberOnce(int[] nums) {Arrays.sort(nums);if (nums.length > 2 && nums[0] ! nums[1]) {//避免只有一个元素的数组return nums[0];}if (nums.length > 2 && nums[nu…

consul安装启动流程

普通软件包安装 首先cd /opt ,将安装包放到该目录下 下载consul安装包 进入consul官网找到自己开发平台对应的安装包下载 https://www.consul.io/downloads.html 或使用命令 wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip (如果…

python print单引号和双引号区别

python中单引号和双引号有什么区别 942次阅读 没有评论 单引号和双引号 在Python中我们都知道单引号和双引号都可以用来表示一个字符串,比如 str1 python str2 "python" str1和str2是没有任何区别的。但是如果遇到需要转义字符的情况,来…

如何使用 AT+WEBSERVER 指令实现自定义的 Webserver html 网页配网

开启 AT 固件中的 Webserver 指令和 FS 指令支持 乐鑫官网发布的默认通用 AT 固件不支持 webserver 配网功能, 需要用户自己搭建 esp-at 环境,并在 sdkconfig 中开启 webserver AT 指令 和 FS 指令的支持, 如下图所示: 测试 AT 固…

Telerik UI for ASP.NET Core Crack

Telerik UI for ASP.NET Core Crack Telerik ASP.NET Core还包括MVC和Kendo UI捆绑包(用于JavaScript)、Figma的设计工具包以及文档处理库、用于ASP.NET Core的Telerik REPL、RTL支持、辅助功能和键盘导航、主题化、虚拟课堂培训、详细文档、演示、KBs和世界级支持。使用一整套…

基于smardaten无代码开发智能巡检系统,让无人机飞得更准

目录 引言需求背景搭建思路开发过程(1)无人机设备数据接入(2)无人机巡检任务管理(3)无人机三维防控监视(4)运防一体化大屏设计(5)异常告警管理(6&…