Linux内存管理 | 二、虚拟地址空间布局

news2024/10/7 18:28:43
img
我的圈子: 高级工程师聚集地
我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业!
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img
img

上一章,我们了解了内存管理的由来以及核心思想,下面我们按照顺序,先来介绍一下Linux虚拟内存空间的管理。

 

同样,我们知道Linux内核抽象出来虚拟内存空间,主要是为了让每个进程都独享该空间,那虚拟内存空间是如何布局的呢?

前提:针对于不同位数的CPU,寻址能力不同,抽象出来的虚拟内存空间大小也不同,我们以常见的32位的CPU为例。

 

1、虚拟内存空间布局

对于32位的CPU,寻址范围为0~2^32,也就是0x00000000-0xFFFFFFFF,即最多抽象出来4G的虚拟内存空间。

4GB的内存空间,在Linux中,又分为用户空间和内核空间,其中0x0000000-0xBFFFFFFF,共3G为用户空间,0xC00000000-0xFFFFFFFF,共1G为内核空间,如下:

image-20230924173124939

无论内核空间还是用户空间,其仍然是在虚拟内存空间基础之上进行划分的,其直接访问的依旧都是虚拟地址,而非物理地址!

我们编写代码后,所生成的可执行程序,运行之后就成为一个系统进程,我们在"虚"的角度来看,每个进程都是独享这4G虚拟地址空间的,

 

2、用户态空间布局

如上所述,用户空间在虚拟内存中分布在0x0000000-0xBFFFFFFF,大小为3G

每一个用户进程,按照访问属性一致的地址空间存放在一起的原则,划分成5个不同的内存区域(访问属性一致指的是:可读,可写,可执行):

  • 代码段Text Segment,也就是我们的二进制程序,代码段需要防止在运行时被非法修改,所以该段为只读
  • 数据段Data Segment,主要存放初始化了的变量,主要包括:静态变量和全局变量,该段为读写
  • BSSBSS Segment,主要存放未初始化的全局变量,在内存中 bss 段全部置零,该段为读写
  • 堆段Heap Segment,主要存放进程运行过程中动态分配的内存段,大小不固定,可动态扩张和缩减,通常使用mallocfree来分配释放,并且堆的增长方向是向上的。
  • 文件映射和匿名映射段Memory Mapping Segment,主要存放进程使用到的文件或者依赖的动态库,从低地址向上增长。
  • 栈段Stack Segment,主要存放进程临时创建的局部变量,函数调用上下文信息等,栈向下增长。

image-20231005160139650

一个可执行程序,可以通过size命令,查看编译出来的可执行文件大小,其中包括了代码段,数据段等数据信息,如下:

donge@Donge:$ size Donge-Demo
   text    data     bss     dec     hex filename
  12538    1916   43632   58086    e2e6 Donge-Demo
  • text:代码段大小
  • data:数据段大小
  • bssbss段大小
  • dec:十进制表示的可执行文件大小
  • hex:十六进制表示的可执行文件大小

 

运行该程序后,可以通过cat /proc/PID/maps命令,或者pmap PID命令,来查看该进程在虚拟内存空间中的分配情况,其中PID为进程的PID号,如下:

donge@Donge:$ cat /proc/16508/maps
55976ff9e000-55976ffa0000 r--p 00000000 08:10 184922                     /home/donge/WorkSpace/Program/Donge_Programs/Donge_Demo/build/Donge-Demo
55976ffa0000-55976ffa2000 r-xp 00002000 08:10 184922                     /home/donge/WorkSpace/Program/Donge_Programs/Donge_Demo/build/Donge-Demo
55976ffa2000-55976ffa3000 r--p 00004000 08:10 184922                     /home/donge/WorkSpace/Program/Donge_Programs/Donge_Demo/build/Donge-Demo
55976ffa3000-55976ffa4000 r--p 00004000 08:10 184922                     /home/donge/WorkSpace/Program/Donge_Programs/Donge_Demo/build/Donge-Demo
55976ffa4000-55976ffa5000 rw-p 00005000 08:10 184922                     /home/donge/WorkSpace/Program/Donge_Programs/Donge_Demo/build/Donge-Demo
55976ffa5000-55976ffaf000 rw-p 00000000 00:00 0
559771d91000-559771db2000 rw-p 00000000 00:00 0                          [heap]
7fec1ad84000-7fec1ad87000 rw-p 00000000 00:00 0
7fec1ad87000-7fec1adaf000 r--p 00000000 08:10 22282                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fec1adaf000-7fec1af44000 r-xp 00028000 08:10 22282                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fec1af44000-7fec1af9c000 r--p 001bd000 08:10 22282                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fec1af9c000-7fec1afa0000 r--p 00214000 08:10 22282                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fec1afa0000-7fec1afa2000 rw-p 00218000 08:10 22282                      /usr/lib/x86_64-linux-gnu/libc.so.6
7fec1afa2000-7fec1afaf000 rw-p 00000000 00:00 0
7fec1afb5000-7fec1afb7000 rw-p 00000000 00:00 0
7fec1afb7000-7fec1afb9000 r--p 00000000 08:10 22068                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fec1afb9000-7fec1afe3000 r-xp 00002000 08:10 22068                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fec1afe3000-7fec1afee000 r--p 0002c000 08:10 22068                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fec1afef000-7fec1aff1000 r--p 00037000 08:10 22068                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7fec1aff1000-7fec1aff3000 rw-p 00039000 08:10 22068                      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
7ffce385d000-7ffce387e000 rw-p 00000000 00:00 0                          [stack]
7ffce394e000-7ffce3952000 r--p 00000000 00:00 0                          [vvar]
7ffce3952000-7ffce3953000 r-xp 00000000 00:00 0                          [vdso]

上面能大致看出该进程的代码段、堆、文件映射段,栈的内存分布等情况,以上就是我们的可执行程序被加载进入内存之后,在用户态虚拟内存空间的布局情况。

 

顺便介绍一下 我的圈子:高级工程师聚集地,期待大家的加入。

3、内核态空间布局

下面我们来看一下内核态的虚拟空间布局,首先我们要知道:

  1. Linux系统中,用户进程通常只能访问用户空间的虚拟地址,只有在执行内陷操作或系统调用时才能访问内核空间。
  2. 所有的进程通过系统调用进入内核态之后,看到的虚拟地址空间都是一样的,他们是共享内核态虚拟内存空间的。

 

32位的内核态虚拟空间在虚拟内存中分布在0xC00000000-0xFFFFFFFF上,大小为1G,其要分为以下几个区

  • 直接映射区(Direct Memory Region:顾名思义,直接映射区就是直接与物理内存建立一一映射关系。从内核空间起始地址开始,到896M的内核空间地址区间,为直接内存映射区,该区域线性地址和分配的物理地址都是连续的。

896M以上的内核地址空间,又称为高端内存区域。

  • 安全保护区:也成为内存空洞,大小为8M,其主要目的是为了避免 非连续区的非法访问,

  • 动态映射区:也就是vmalloc Region,该区域由Vmalloc函数分配,特点是:虚拟地址空间连续,但是物理地址空间不一定连续。

  • 永久映射区(Persistent Kernel Mapping Region:该区域主要用于访问高端内存,通过alloc_page (_GFP_HIGHMEM)接口分配高端内存页,可以使用kmap函数将分配到的高端内存映射到该区域。

  • 固定映射区(Fixing kernel Mapping Region:该区域虚拟内存地址可以自由映射到物理内存的高端地址上,“固定”表现在“虚拟内存空间地址是固定的”,被映射的物理地址是可变的。

为什么会有固定映射这个概念呢 ?

比如:在内核的启动过程中,有些模块需要使用虚拟内存并映射到指定的物理地址上,而且这些模块也没有办法等待完整的内存管理模块初始化之后再进行地址映射。因此,内核固定分配了一些虚拟地址,这些地址有固定的用途,使用该地址的模块在初始化的时候,将这些固定分配的虚拟地址映射到指定的物理地址上去。

image-20231005155942462

4、总结

以上就是整个虚拟地址空间的划分,总结如下:

image-20231005160802093

点赞+关注,永远不迷路

img
欢迎关注 公号&星球【嵌入式艺术】,董哥原创!

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

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

相关文章

SNAP计算哨兵2号的LAI/FVC/FAPAR

SNAP计算LAI 简介 SNAP的计算LAI方法是基于PROSAIL模型,集成的模块,很方便。 首先要下载SNAP软件,下载步骤见博文 打开数据 找到影像的.xml文件 拖入左边的空白框中,发现所有波段会显示如下。这些数据都是已经经过处理完成之后…

Vue之VueX知识探索(一起了解关于VueX的新世界)

目录 前言 一、VueX简介 1. 什么是VueX 2. VueX的作用及重要性 3. VueX的应用场景 二、VueX的使用准备工作 1. 下载安装VueX 2. vuex获取值以及改变值 2.1 创建所需示例 2.2 将创建好的.vue文件页面显示 2.3 创建VueX的相关文件 2.4 配置VueX四个js文件 2.5 加载到vue示…

网络架构介绍

1 网络 7 层架构 7 层模型主要包括: 1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为1、0…

简述电子设计中的EMC、EMI、ESD

简述电子设计中的EMC、EMI、ESD ESD EMI EMC ESD、EMI、EMC 设计是电子工程师在设计中遇到最常见的难题,电磁兼容性(EMC)是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的能力。 因此&#xff0…

【2023年11月第四版教材】第24章《法律法规与标准规范》(合集篇)

第24章《法律法规与标准规范》(合集篇) 1 民法典(合同编)2 招标投标法2.1 关于时间的总结2.2 内容 3 政府采购法4 专利法5 著作权法6 商标法7 网络安全法8 数据安全法 1 民法典(合同编) 1、要约是希望和他人订立合同的…

LLM - 旋转位置编码 RoPE 代码详解

目录 一.引言 二.RoPE 理论 1.RoPE 矩阵形式 2.RoPE 图例形式 3.RoPE 实践分析 三.RoPE 代码分析 1.源码获取 2.源码分析 3.rotary_emb 3.1 __init__ 3.2 forward 4.apply_rotary_pos_emb 4.1 rotate_half 4.2 apply_rotary_pos_emb 四.RoPE 代码实现 1.Q/K/V …

苹果ios开发者ipa文件包内测人数签名真机数量满了应该怎么做?

苹果ios开发者ipa文件包内测人数签名真机数量满了应该怎么做? 有人总是问我开发者的设备满了怎么做才可以让设备增加?或者我要怎么做才能让员工的设备都可以安装,那么首先我们要做到的就是要知道我们的开发者都是拥有多少内测设备&#xff1f…

放大器的输入、输出电压范围的理解

问题电路 由于运放SGM8295不是轨到轨的电路,导致U29.1输出电压只有当输入到一定门限的时候才会有输出。 上图表示输入电压工作范围为如上,在此以外的不能正常工作。 一篇很好的运放的输入/输出文章介绍 https://zhuanlan.zhihu.com/p/351740051?utm_id0…

【Java学习之道】异常的处理方式

引言 今天我们将聚焦于异常处理,这是每一个Java程序员都应该掌握的核心技能之一。通过学习这些内容,你将能够更好地应对程序中的意外情况,提高程序的健壮性和可靠性。 一、异常的处理方式 在Java中,异常处理主要通过使用try-ca…

后厂村路灯在线签名网站,在线签名工具,IPA在线签名

IPA在线签名工具网站,在线实现IPA包签名 案例网站:在线签名 - 后厂村路灯https://sign.vx365.vip/ 用户可以自定义签名网站样式。 用户可以独立部署到自己服务器,使用自己的域名。 用户可以使用自己服务器,加快签名速度&#xf…

YB4618 具有充电前端过电压和过温保护功能,低压差充电前端 OVP 保护开关IC

YB4618 低压差充电前端 OVP 保护开关 概述: YB4618 具有充电前端过电压和过温保护功能。支持 3V 到 40V 的宽输入电压工作范围。过压保护阈值可以外部设置或采用内部默认设置。超快的过压保护响应速度能够确保后级电路的安全。集成了超低导通阻抗的 nFET 开关,确…

Explain执行计划字段解释说明---type字段说明(02)

type显示访问类型详解 (1)system 表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。 (2)const 表示通过索引一次就找到了,const用…

提升战斗力!吃鸡行家分享顶级游戏干货,助你轻松拿下绝地求生

作为吃鸡行家,我们都知道,在绝地求生中提高战斗力至关重要。今天我来分享一些独特的干货,帮助你成为顶级的吃鸡玩家,并分享一些方便吃鸡作图、装备皮肤库存展示和查询的技巧。 首先,让我们来谈谈绝地求生作图工具推荐。…

【Java学习之道】异常的概念与分类

引言 异常处理是Java编程中重要的一部分,它可以让我们更好地处理程序中可能出现的错误和异常情况。同时,Java也提供了强大的输入/输出流功能,让我们可以轻松地读取和写入数据。这一章,我们就来探讨这两个话题,让你的J…

HT for Web 风格属性手册教程 | 图扑软件

图扑软件明星产品 HT for Web 是一套纯国产化独立自主研发的 2D 和 3D 图形界面可视化引擎。HT for Web(以下简称 HT)图元的样式由其 Style 属性控制,并且不同类型图元的 Style 属性各不相同。为了方便查询和理解图元的 Style 属性&#xff0…

Docker-compos

Docker-compose 简介 Docker-Compose项目是基于Python开发的Docker官方开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是 工程(project),服务(service&#…

大模型的超级“外脑”——向量数据库解决大模型的三大挑战

随着AI大模型产品及应用呈现爆发式增长,新的AI时代已经到来。向量数据库可与大语言模型配合使用,解决大模型落地过程中的痛点,已成为企业数据处理和应用大模型的必选项。在近日举行的华为全联接大会2023期间,华为云正式发布GaussDB向量数据库。GaussDB向量数据库基于GaussD…

MySQL数据库——SQL优化(2)-order by 优化、group by 优化

目录 order by 优化 概述 测试 优化原则 group by 优化 测试 优化原则 order by 优化 概述 MySQL的排序,有两种方式: Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sortbuffer中完成排…

提升吃鸡战斗力,分享顶级作战干货!

大家好!作为一名吃鸡玩家,你是否也希望提高自己的游戏战斗力?在这里,我将为大家分享一些顶级游戏作战干货,以及方便吃鸡作图和查询装备皮肤库存的实用工具。 首先,让我们提到绝地求生作图工具推荐。通过使用…

提升吃鸡战斗力,分享顶级游戏干货,一站式解决你的游戏需求!

大家好!作为一名吃鸡玩家,你是否希望提升自己的游戏战斗力,分享顶级的游戏作战干货,同时方便进行吃鸡作图,查询装备皮肤库存,还能查防止被骗游戏账号黑名单,查询失信人及VAC封禁情况等。今天我将…