Linux内存地址空间

目录

一、虚拟地址空间

1.虚拟地址空间的定义

2.虚拟地址空间的布局

二、内存壁垒

        1.内存壁垒的定义​编辑

2.段错误

三、内存映射的建立与解除

        (1)mmap

        (2)munmap

(3)堆内存的分配和释放

1.sbrk

2.brk


        我们先来思考一个问题:你写出的程序经过编译之后得到a.out是如何跑起来的呢?

        a.out文件是二进制指令的集合。其内容经过了操作系统的管理调度被加载到了物理内存中,CPU再从物理内存中读取指令,并且执行,这样我们的程序就跑起来啦!

一、虚拟地址空间

1.虚拟地址空间的定义

        

        这段文字告诉了我们:我们看到的地址是假的!是操作系统给我们看到的表象,我们借助这个表象的地址+操作系统存下的映射关系就能找到相应的物理内存,从而进行数据的访问了。

        那么操作系统为什么要维护这样一个映射关系表呢?而不给我们实际的物理地址?

其实在计算机刚刚诞生的时候(还没有操作系统),人们就是这样做的,但是这样会有许许多多的麻烦事,人们要不断的计算所使用内存的大小,从而规划下一步在哪个地方使用内存,但是一旦操作不当就会导致内存泄漏或者程序崩溃。

        于是人们便开发了操作系统这样的一个东西来帮助我们合理使用内存。而操作系统自己用了一个虚拟内存的东西来映射实际的物理内存,从而知道哪一块空间被使用了,哪一块空间没有被使用,自此我们对内存的操作大部分都交给了操作系统来处理,于是人力资源得到了极大的程度的解放。

32位:

        (1)对于32位操作系统而言,每个进程都有4G大小的虚拟地址空间。

        (2)所谓的地址空间就是一个地址范围,表示程序的寻址能力(但是并不意味着一定用到了4G大小的物理内存)我们所看到的虚拟地址都是在4G的这个范围内的

        (3)对于32位操作系统,其虚拟地址空间范围是0X0000 0000到0XFFFF FFFF也就是4G

        (4)其中的0到3G-1范围归用户使用,称为用户地址空间;3G到4G-1的范围归内核使用,称为内核地址空间。

64位:

        (1)对于64位操作系统而言,目前的程序还没有那么大的内存需求,所以不支持完全的64位虚拟地址

        (2)64位操作系统上,其用户的地址空间是0X0000 0000 0000 0000到0X0000 FFFF FFFF FFFF

        (3)其内核的地址空间是0XFFFF 0000 0000 0000到0XFFFF FFFF FFFF FFFF

        (4)内核地址空间和用户地址空间之间的是不规范地址空间,不允许使用

        (5)用户地址空间的代码不能直接访问内核空间的代码和数据,但是可以通过系统调用进入内核,间接与系统内核交互

2.虚拟地址空间的布局

二、内存壁垒

        1.内存壁垒的定义

        从上面一段话中,我们可以看到:每一个进程中,只有内核空间的虚拟地址是一样的,别的用户地址空间部分都是各自独立的(可能在两个进程中,虚拟地址的值都是一样的,但是映射在物理内存中却有差别)

        且内核的代码和数据只能通过系统调用来访问!!!

2.段错误

        

        第一种情况是:对没有映射到物理内存的虚拟内存进行了访问,但是操作系统没有记录这个虚拟地址,所以就成了一个野指针类似的虚拟地址。

        第二种情况是:在只读内存区域进行了写操作(比如在常量代码段进行修改)

三、内存映射的建立与解除

        (1)mmap

        一般情况下,我们第一个参数start都给的是NULL让系统自己来决定细虚拟地址;

        length要求是按页圆整(即4096的整数倍个字节);

        而prot必须在PROT_READ和PROT_WRITE以及PROT_EXEC和PROT_NONE中选择一个,作为我们映射区的操作权限;

        最后,flags是映射标志,我们这里因为没有涉及到文件,所以是将虚拟内存映射到物理内存中,所以要选择MAP_ANONYMOUS(注意这里的flags都是可以多种选择的,比如我们可以用MAP_PRIVATE|MAP_ANONYMOUS让他既是匿名映射又是映射到缓冲区中)

        fd是文件描述符,我们在后续讲到文件系统的时候再说

        (2)munmap

(3)堆内存的分配和释放

1.sbrk

2.brk

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

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

相关文章

springboot238光影视频

光影视频平台 摘 要 使用旧方法对光影视频平台的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在光影视频平台的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开…

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

原文链接:如何用ChatGPTGEEENVIPython进行高光谱,多光谱成像遥感数据处理? 第一:遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二:ChatGPT ChatGPT可以做什么? ChatGPT演示使用 …

美梦从舒适开始,康姿百德床垫为睡眠健康护航

在当今社会,高质量的睡眠已成为人们对生活品质的追求,对床垫的选择也变得越来越讲究。在我们繁忙的生活中,一张优质的床垫不仅是我们舒适休息的保障,更是保持健康生活方式的重要部分。康姿百德床垫,作为市场上的佼佼者…

BEVFusion

1. 简介 融合激光雷达和相机的信息已经变成了3D目标检测的一个标准,当前的方法依赖于激光雷达传感器的点云作为查询,以利用图像空间的特征。然而,人们发现,这种基本假设使得当前的融合框架无法在发生 LiDAR 故障时做出任何预测&a…

手写 Attention 迷你LLaMa2——LLM实战

https://github.com/Yuezhengrong/Implement-Attention-TinyLLaMa-from-scratch 1. Attention 1.1 Attention 灵魂10问 你怎么理解Attention? Scaled Dot-Product Attention中的Scaled: 1 d k \frac{1}{\sqrt{d_k}} dk​ ​1​ 的目的是调节内积&…

前端的文字的字体应该如何设置

要设置文字的字体,在CSS中使用font-family属性。这个属性可以接受一个或多个字体名称作为其值,浏览器会按照列表中的顺序尝试使用这些字体渲染文本。如果第一个字体不可用,浏览器会尝试使用列表中的下一个字体,依此类推。 字体设…

国内哪个工具可以平替chatgpt?国内有哪些比较好用的大模型gpt?

我自己试用了很多的平台,发现三个比较好的大模型平台,对普通用户也比较的友好的,而且返回内容相对来说,正确率更高的,并且相关场景插件比较丰富的国内厂商。 本文说的,是我自己觉得的,比较有主观…

准备车载测试面试的小伙伴,赶紧看起来!

随着现代汽车的电子化程度越来越高,汽车总线系统也变得越来越复杂。汽车总线测试是一项重要的任务,它有助于确定车辆电子系统中的问题,并保障车辆的安全和可靠性。 CAN总线…… 控制器区域网(Controller Area Network&#xff0c…

体感游戏开发的最大挑战是什么?

体感游戏开发的最大难度之一是需要克服的技术挑战,包括硬件和软件方面的复杂性。此类游戏需要利用传感器、摄像头、运动检测设备等技术,让玩家的实际身体动作能够准确地被游戏系统捕获和识别。以下是体感游戏开发可能面临的一些主要挑战: 1.实…

线段树模型及例题整理

线段树的应用范围非常广,可以处理很多与区间有关的题目。 将区间抽象成一个节点,在这个节点中储存这个区间的一些值,那么如果看成节点的话,这就很像一棵满二叉树,所以我们可以用一维数组来储存节点。那么就要考虑父子节…

探讨苹果 Vision Pro 的 AI 数字人形象问题

Personas 的设计模糊性: 部分人认为这种模糊设计可能是出于安全考虑🛡️。安全角度:Personas 代表着你的 AI 数字形象,在创建时,它相当于你的 AVP(生物识别扫描器的存在增加了冒充的难度)。如果…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:颜色渐变)

设置组件的颜色渐变效果。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…