Linux内存管理--系列文章壹

news2024/10/1 19:41:20

一、引子

作者、我在上班闲着没事的时候,看了一些关于Linux内存管理和程序装载、链接的文章,然后自己就总结出了一些东西。
本系列文章一方面将资料中的长篇大论总结到最少、以方便可以直接找到答案,一方面也是方便面试的时候可以吹牛逼。
Linux的内存管理模块是Linux内核中最复杂、最大的一块了。本系列将分为四方面来讲述:
1.程序在内存中分区,
2.ELF文件如何装载、加载,
3.内存管理的硬件架构分类,
4.内存空间管理。

二、内存分类

首先要先了解内存有几种,才能更好的了解内存管理。
1.物理内存
物理内存(Physical memory)是相对于虚拟内存而言的。物理内存指通过物理内存条而获得的内存空间。
常见的物理内存规格有2G、4G等,现如今随着计算机硬件的发展,已经出现8G、16G甚至更高容量的内存规格。
在应用中,自然是顾名思义,物理上,真实存在的插在主板内存槽上的内存条的容量的大小。
看计算机配置的时候,主要看的就是这个物理内存。
2.虚拟内存
	虚拟内存是计算机系统内存管理的一种技术。
	它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),
	而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
	大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

本系列文章的前两方面如无特殊说明都是说虚拟内存。

三、程序在内存中分区

计算机按CPU位数不同可分为8位系统、32位系统、64位系统。本次介绍目前最常用的32位和64位系统的内存分区。
虚拟内存又分为用户态内存和内核态内存。

3.1用户态内存

3.1.1 32位系统

32位理论上最大能够使用的内存是4GB。其中3-4G地址是内核态内存,是系统内核使用的内存。0-3G是用户态内存,这是程序员可以使用的内存。
在使用PAE技术(Physical Address Extension)后,32位系统可以支持最多64GB的物理内存,但是每个进程的地址空间仍然只有4GB,而且需要硬件和驱动的支持。PAE意思是物理地址扩展,它是一种让32位系统能够识别和使用超过4GB的物理内存地址的技术。

1.程序运行前在二进制文件中的机器码会被加载到内存中,放这些机器码的空间就是代码段

2.程序运行前会将程序中全局变量和静态变量根据ELF文件加载进内存。

有初始值的全局变量和静态变量会放在数据段。这个时候这些变量已经有数据了。
没有初始值的全局变量和静态变量会放在BSS段。这个时候这些变量会在加载进内存时被初始化为0

这三个段的内存是在程序编译期间就已经确定的。

3.程序运行中程序员向系统动态申请的内存,会放在

地址增长方向是从低地址到高地址增长。

4.动态链接库的内容和mmap映射出的共享内存空间是存放在文件映射和匿名映射区

地址增长方向是从高地址到低地址增长。
程序运行中依赖的动态链接库,会以.so文件放在磁盘里。这些文件的数据段、代码段、BSS段等也会加载进内存。
系统调用mmap进行内存和文件的映射。

5.程序运行中调用的函数、使用的局部变量和函数入参,将放入

地址增长方向是从高地址到低地址增长。

6.在用户态中还有一块不能被使用的内存地址,被称为保留区

这块区域一般是不允许被访问的,地址是从0x0000 0000 到0x0804 8000,所以会将无效的指针指向NULL。

7.未分配区域有两块在栈和文件映射和匿名映射区之间,堆和文件映射和匿名映射区之间。

未分配区域是为了让堆能继续向上申请和栈向下使用能留有足够空间。

如图:

在这里插入图片描述

3.1.2 64位系统

64位理论上最大能够使用的内存是2的64次方字节,但在目前的Linux上只使用了2的48次方字节来描述内存,也就是现在有256TB的内存空间。系统在理论空间中将最高的128T作为内核态空间,最低的128T作为用户态空间。
我找到的资料和系统都是按48次方寻址的,还有一种说法现在已经可以真实描述更多的内存空间。但我未找到相应的系统。大家可以使用命令去查看你的系统内存分布情况,看有没有比48位还要多的。

cat /proc/pid/maps
pmap pid

64位系统和32位系统内存分布大致相同,下面仅介绍不同点

1.在用户态和内核态间有一块不能被使用的内存地址,被称为canonical address空洞

用户态的空间是128T,所以最高的地址是0X0000 7FFF FFFF FFFF.它的高17位全为0。
内核态的空间也是128T,所以最低的地址是0XFFFF 8000 0000 0000.它的高17位全为1。
在这两个中间的高17位既不全为1又不全为0的地址被称为canonical address空洞。
用户态空间和内核态空间称为canonical address。
目前48位寻址的高 16 位必须要么全是 0,要么全是 1。具体是 0 还是 1,取决于第 47 位是 0 还是 1:如果第 47 位是 1,则高 16 位全是 1,反之同理。这些是高17位的全部一样的地址才能被访问,之所以这样做,是考虑到以后实现 52、56、60 以及真正的 64 位 寻址 时,这种地址形式(48 位+16 符号位)无需做出任何的改变就可以平滑的兼容(52、56、60 或 64 位 virtual address)。

2.在数据段和代码段间一块不可访问的内存地址,被称为非法访问区。这是防止程序读写数据段时,非法访问代码段。该区域可以让非法访问直接崩溃。

如图:

在这里插入图片描述

本篇大致讲述了用户态内存分布情况,下一篇文章将会对内核态内存分布情况进行阐述。

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

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

相关文章

从 Language Model 到 Chat Application:对话接口的设计与实现

作者:网隐 RTP-LLM 是阿里巴巴大模型预测团队开发的大模型推理加速引擎,作为一个高性能的大模型推理解决方案,它已被广泛应用于阿里内部。本文从对话接口的设计出发,介绍了业界常见方案,并分享了 RTP-LLM 团队在此场景…

Spring-AOP基础(全在这里)

八股文部分来源于网络,例子为原创 OOP(Object-oriented programming) 也就是面向对象编程,继承,封装,多态。 局限性 静态语言:类结构一旦定义,不容易被修改(并不是无法修改)。只能侵入性扩展&#xff1a…

C语言 --- 指针(5)

目录 一.sizeof和strlen对比 1.sizeof 2.strlen 3.strlen 和sizeof的对比 二.数组和指针笔试题目详解 回顾:数组名的理解 1.一维数组 2.字符数组 代码1: 代码2: 代码3: 代码4: 代码5: 代码6&am…

《JAVA与模式》之门面模式

系列文章目录 文章目录 系列文章目录前言一、医院的例子二、门面模式的结构三、门面模式的实现四、门面模式的优点五、门面模式在Tomcat中的使用前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

【论文阅读】OpsEval

粗糙翻译,如有兴趣请看原文,链接:https://arxiv.org/abs/2310.07637 摘要 信息技术(IT)运营(Ops),特别是用于IT运营的人工智能(AlOps),是保持现…

改进沙猫群优化的BP神经网络ISCSO-BP(时序预测)的Matlab实现

改进沙猫群优化的BP神经网络(ISCSO-BP)是一种结合了改进的沙猫群优化算法(Improved Sand Cat Swarm Optimization, ISCSO)和反向传播(Back Propagation, BP)神经网络的模型,旨在提高时序预测的准…

LLM 推理优化探微 (2) :Transformer 模型 KV 缓存技术详解

编者按:随着 LLM 赋能越来越多需要实时决策和响应的应用场景,以及用户体验不佳、成本过高、资源受限等问题的出现,大模型高效推理已成为一个重要的研究课题。为此,Baihai IDP 推出 Pierre Lienhart 的系列文章,从多个维…

王道机试C++第 5 章 数据结构一:向量vector和蓝桥杯13年两个程序 Day31

5.1 向量 有限个类型相同的变量的线性集合,组成数组的各个变量称为数组的元素。给每个元素分配唯一的一个下标,就能用这个下标指代该元素。还可通过下标直接访问数组中的任何一个元素,并且这些访问能在常数时间内完成。 1.STL-v…

算法练习:同向双指针(滑动窗口)

目录 1. 长度最小的数组2. 无重复字符的最长字符串3. 最大连续1的个数4. 将x减到0的最小操作数5. 水果成篮6. 找到字符串中所有字母异位词7. 串联所有单词的子串8. 最小覆盖子串 1. 长度最小的数组 题目信息: 题目链接: 长度最小的数组思路: …

观察主线程退出对子线程的影响

✨主进程以pthread_exit(0)方式退出——线程退出 ✨子线程pthread_cancel方式杀死父线程 ✨主线程以return,exit(0)方式退出——进程退出  🔱return   🔱return在主函数   🔶return在子函数  🔶exit(0)   &…

数据结构——堆的应用 Topk问题

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

谷歌开源的LLM大模型 Gemma 简介

相关链接: Hugging face模型下载地址:https://huggingface.co/google/gemma-7bGithub地址:https://github.com/google/gemma_pytorch论文地址:https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf官方博客&…

多址接入技术 ---FDMA、TDMA、CDMA

1、多址接入技术 所谓多址技术就是把同一个无线信道按照时间、 频率等进行分割, 使不同的用户都能够在不同的分割段中使用这一信道, 而又不会明显地感觉到他人的存在, 就好像自己在专用这一信道一样。 占用不同的分割段就像是拥有了不同的地址, 使用同一信道的多个用户就…

Vue.js过滤器:让数据展示更灵活

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Unity的相机跟随和第三人称视角二

Unity的相机跟随和第三人称视角二 展示介绍第二种相机模式远离代码总结 展示 我录的视频上可能看不太出来,但是其实今天的这个方法比原来写的那个方法更简便并且死角更少一些。 这里我也做了两个人物偏移的视角,按Q是原来的两个相机模式切换&#xff0c…

问题 | 程序员求职宝典

程序员的金三银四求职宝典 随着春天的脚步渐近,对于许多程序员来说,一年中最繁忙、最重要的面试季节也随之而来。金三银四,即三月和四月,被广大程序员视为求职的黄金时期。在这两个月里,各大公司纷纷开放招聘,求职者们则通过一轮又一轮的面试,力争心仪的职位。而如何在…

从零学习Linux操作系统 第三十二部分 Ansible中的变量及加密

一、变量的基本设定及使用方式 变量命名(与shell相同): 只能包含数字,下划线,字母 只能用下划线或字母开头 .变量级别: 全局从命令行或配置文件中设定的paly:在play和相关结构中设定的主机:由清单&…

NeRF模型NeRF模型

参考视频:https://www.youtube.com/watch?vHfJpQCBTqZs&ab_channelVision%26GraphicsSeminaratMIT NeRF模型的输入输出: 输入: (x, y, z): 一个三维空间坐标,代表场景中的一个位置点(θ, φ): 视线方向,θ表示与y轴的夹角,φ表示与x轴的夹角,用两个角度可以…

(C语言)strcpy与strcpy详解,与模拟实现

目录 1. strcpy strcpy模拟实现&#xff1a; 实现方法1&#xff1a; 实现方法2&#xff1a; 2. strcat strcat模拟实现&#xff1a; 1. strcpy 作用&#xff1a;完成字符串的复制。 头文件&#xff1a;<string.h> destination是字符串要复制到的地点&#xff0c;s…

图片在div完全显示

效果图&#xff1a; html代码&#xff1a; <div class"container" style" display: flex;width: 550px;height: 180px;"><div class"box" style" color: red; background-color:blue; width: 50%;"></div><div …