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

一、引子

作者、我在上班闲着没事的时候,看了一些关于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.它的高16位全为0。
内核态的空间也是128T,所以最低的地址是0XFFFF 8000 0000 0000.它的高16位全为1。
在这两个中间的高16位既不全为1又不全为0的地址被称为canonical address空洞。
用户态空间和内核态空间称为canonical address。

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

如图:

在这里插入图片描述

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

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

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

相关文章

【Docker】golang使用DockerFile正确食用指南

【Docker】golang使用DockerFile正确食用指南 大家好 我是寸铁👊 总结了一篇golang使用DockerFile正确食用指南✨ 喜欢的小伙伴可以点点关注 💝 问题背景 今天寸铁想让编写好的go程序在docker上面跑,要想实现这样的效果,就需要用…

小程序 van-field label和输入框改成上下布局

在组件上面加个样式就行&#xff1a;custom-style"display:block;" <van-field label"备注说明" type"textarea" clearable title-width"100px" custom-style"display:block;" placeholder"请输入" /> …

大载重无人机基础技术,研发一款50KG负重六旋翼无人机技术及成本分析

六旋翼无人机是一种多旋翼无人机&#xff0c;具有六个旋翼&#xff0c;通常呈“X”形布局。它采用电动串列式结构&#xff0c;具有垂直起降、悬停、前飞、后飞、侧飞、俯仰、翻滚等多种飞行动作的能力。六旋翼无人机通常被用于航拍、农业植保、环境监测、地形测绘等领域。 六旋…

Day34-Linux网络管理4

Day34-Linux网络管理4 1. IP地址分类与子网划分基础1.1 什么是IP地址1.2 十进制与二进制的转换1.3 IP地址的分类1.4 私网地址和局域网地址 2. 通信类型3. 子网划分讲解3.1 为什么要划分子网&#xff1f;3.2 什么是子网划分&#xff1f;3.3 子网划分的作用&#xff1f;3.4 子网划…

云计算项目十一:构建完整的日志分析平台

检查k8s集群环境&#xff0c;master主机操作&#xff0c;确定是ready 启动harbor [rootharbor ~]# cd /usr/local/harbor [rootharbor harbor]# /usr/local/bin/docker-compose up -d 检查head插件是否启动&#xff0c;如果没有&#xff0c;需要启动 [rootes-0001 ~]# system…

如何使用Hexo搭建个人博客

文章目录 如何使用Hexo搭建个人博客环境搭建连接 Github创建 Github Pages 仓库本地安装 Hexo 博客程序安装 HexoHexo 初始化和本地预览 部署 Hexo 到 GitHub Pages开始使用发布文章网站设置更换主题常用命令 插件安装解决成功上传github但是web不更新不想上传文章处理方式链接…

Yolov8模型用torch_pruning剪枝

目录 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; 原理 遍历所有分组 高级剪枝器 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680…

JVM基本概念、命令、参数、GC日志总结

原文: 赵侠客 一、前言 NPE&#xff08;NullPointerException&#xff09;和OOM&#xff08;OutofMemoryError&#xff09;在JAVA程序员中扮演着重要的角色&#xff0c;它也是很多人始终摆脱不掉的梦魇&#xff0c;与NPE不同的是OOM一旦在生产环境中出现就意味着只靠代码已经无…

java集合题库详解

1. Arraylist与LinkedList区别 可以从它们的底层数据结构、效率、开销进行阐述哈 ArrayList是数组的数据结构&#xff0c;LinkedList是链表的数据结构。 随机访问的时候&#xff0c;ArrayList的效率比较高&#xff0c;因为LinkedList要移动指针&#xff0c;而ArrayList是基于索…

Java 客户端向服务端上传文件(TCP通信)

一、实验内容 编写一个客户端向服务端上传文件的程序&#xff0c;要求使用TCP通信的的知识&#xff0c;完成将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文件名&#xff0c;即IP&#xff08;count&#…

OpenSearch 与 Elasticsearch:哪个开源搜索引擎适合您?

当谈论到搜索引擎产品时&#xff0c;Elasticsearch 和 OpenSearch 是两个备受关注的选择。它们都以其出色的功能和灵活性而闻名&#xff0c;但在一些方面存在一些差异。在本文中&#xff0c;我们将从功能和延展性、工具与资源、价格和许可这三个角度对这两个产品进行论述。通过…

qt+opencv人脸人眼检测识别

项目运行涉及到opencv库&#xff0c;以及haarcascade_frontalface_default.xml和haarcascade_eye_tree_eyeglasses.xml。qt配置opencv可见先前文章&#xff0c;另外这两份OpenCV 中用于眼睛检测的级联分类器xml文件&#xff0c;是我在网上下载的。 把要使用到的文件都放到当前…

鸿蒙培训开发:就业市场的新热点~

金三银四在即&#xff0c;随着春节假期结束&#xff0c;各行各业纷纷复工复产&#xff0c;2024年的春季招聘市场也迎来了火爆的局面。最近发布的《2024年春招市场行情周报&#xff08;第一期&#xff09;》显示&#xff0c;尽管整体就业市场仍处于人才饱和状态&#xff0c;但华…

spring-cloud-openfeign 3.0.0(对应spring boot 2.4.x之前版本)之前版本feign整合ribbon请求流程

在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 下图为自己整理的

Excel 快速填充/输入内容

目录 一. Ctrl D/R 向下/右填充二. 批量输入内容 一. Ctrl D/R 向下/右填充 ⏹如下图所示&#xff0c;通过快捷键向下和向右填充数据 &#x1f914;当选中第一个单元格之后&#xff0c;可以按住Shift后&#xff0c;再选中最后一个单元格&#xff0c;可以选中第一个单元格和最…

自动驾驶技术解析与关键步骤

目录 前言1 自动驾驶主要技术流程1.1 车辆周围环境感知1.2 车辆和行人检测分析1.3 运动轨迹规划 2 关键技术概述2.1 车辆探测与图片输入2.2 行人检测2.3 运动规划2.4 电子地图2.5 轨迹预测2.6 交通灯分析2.7 故障检测 结语 前言 自动驾驶汽车作为未来交通领域的重要发展方向&a…

【Python】-入门:安装配置和IDLE的使用

Python的安装和配置 一、下载Python安装包 首先&#xff0c;你需要从Python的官方网站&#xff08;https://www.python.org/downloads/&#xff09;下载适合你操作系统的Python安装包。请注意&#xff0c;Python 2.x版本即将停止维护&#xff0c;因此推荐下载Python 3.x版本。…

【LGR-176-Div.2】[yLCPC2024] 洛谷 3 月月赛 I(A~C and G<oeis>)

[yLCPC2024] A. dx 分计算 前缀和提前处理一下区间和&#xff0c;做到O&#xff08;1&#xff09;访问就可以过。 #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);…

Redis作为缓存的数据一致性问题

背景 使用Reids作为缓存的原因&#xff1a; 在高并发场景下&#xff0c;传统关系型数据库的并发能力相对比较薄弱&#xff08;QPS不能太大&#xff09;&#xff1b; 使用Redis做一个缓存。让用户请求先打到Redis上而不是直接打到数据库上。 但是如果出现数据更新操作&#xff…

Windows下同一电脑配置多个Git公钥访问不同的账号

前言 产生这个问题的原因是我在Gitee码云上有两个账号,为了方便每次不用使用http模式推拉代码,于是我就使用了ssh的模式,起初呢我用两台电脑分别连接两个账号,用起来也相安无事,近段时时间台式机在家里,我在外地出差了,就想着把ssh公钥同时添加到不同的账号里,结果却发现不能用…