返回顶部
首页 > 资讯 > 操作系统 >Linux内存布局是怎样的
  • 138
分享到

Linux内存布局是怎样的

2023-06-28 10:06:50 138人浏览 独家记忆
摘要

这篇“linux内存布局是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内存布局是怎样的”文章吧。我们先来看

这篇“linux内存布局是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内存布局是怎样的”文章吧。

我们先来看下Linux内存布局:

Linux内存布局是怎样的

在linux中,每一个进程都被抽象为task_struct结构体,称为进程描述符,存储着进程

各方面的信息;例如打开的文件,信号以及内存等等;然后task_struct的一个属性mm_struct管理着进程的所有虚拟内存,称为内存描述符。在mm_struct结构体中,存储着进程各个内存段的开始以及结尾,如上图所示;这个进程使用的物理内存,即常驻内存RSS页数,这个内存使用的虚拟地址空间VSZ页数,还有这个进程虚拟内存区域集合和页表。

从上面这个图可以看出,进程是有代码段Text segment,数据段(已初始化的全局,静态变量),BSS段(未初始化的全局,静态变量),堆,内存映射区以及栈;

每一块虚拟内存区(VMA)都是由一块连续的虚拟地址组成,这些地址从不覆盖。一个vm_area_struct实例描述了一块内存区域,包括这块内存区域的开始以及结尾地址;flags标志决定了这块内存的访问权限和行为;vm_file决定这块内存是由哪个文件映射的,如果没有文件映射,则这块内存为匿名的(anonymous)。上述图中提到的每个内存段,都对应于一个vm_area_struct结构。如下图所示

Linux内存布局是怎样的

上图即为/bin/Gonzo进程的内存布局。程序的二进制文件映射到代码段和数据段,代码段为只读只执行,不可更改;全局以及静态的未初始化的变量映射到BSS段,为匿名映射,堆和栈也是匿名映射,因为没有相应的文件映射;内存映射区可以映射共享库,映射文件以及匿名映射,所以这块内存段可以是文件映射也可以是匿名映射。而且不同的文件,映射到不同的vm_area_struct区。

这些vm_area_struct集合存储在mm_struct中的一个单向链表和红黑树中;当输出/proc/pid/maps文件时,只需要遍历这个链表即可。红黑树主要是为了快速定位到某一个内存块,红黑树的根存储在mm_rb域。

之前介绍过,线性地址需要通过页表才能转换为物理地址。每个进程的内存描述符也保存了这个进程页表指针pgd,每一块虚拟内存页都和页表的某一项对应。

虚拟内存是不存储任何数据的,它只是将地址空间映射到物理内存。物理内存有内核伙伴系统分配,如果一块物理内存没有被映射,就可以被伙伴系统分配给虚拟内存。刚分配的物理内存叶框可能是匿名的,存储进程数据,也可能是也缓存,存储文件或块设备的数据。一块虚拟内存vm_area_struct块是由连续的虚拟内存页组成的,而这些虚拟内存块映射的物理内存却不一定连续,如下图所示:

Linux内存布局是怎样的

如上图所示,有三个页映射到物理内存,还有两个页没有映射,所以常驻内存RSS为12kb,而虚拟内存大小为20kb。对于有映射到物理内存的三个页的页表项PTE的Present标志设为1,而两个没有映射物理内存的虚拟内存页表项的Present位清除。所以这时访问那两块内存,则会导致异常缺页。

vma就像应用程序和内核的一个契约。当应用程序申请内存或者文件映射时,内核先响应这个请求,分配或更新虚拟内存;但是这些虚拟内存并没有映射到真实的物理内存。而是等到内存访问产生一个内存异常缺页时才真正映射物理内存。即当访问没有映射的虚拟内存时,由于页表项的Present位没有被设置,所以此时会产生一个缺页异常。vma记录和页表项两个在解决内存缺页,释放内存以及内存swap out都起着重要的作用。下面图展示了上述情况:

Linux内存布局是怎样的

1、一开始堆中只有8kb的内存,而且都已经映射到物理内存;

2、当调用brk()函数扩展堆时,新的页是没有映射到物理内存的,

3、当处理器需要访问一个地址,而且这个地址在上述刚分配的虚拟内存中,这时产生一个缺页异常;

4、这时进程向伙伴系统申请一页的物理内存,映射到那块虚拟内存上,并添加页表项,设置Present位.

以上就是关于“Linux内存布局是怎样的”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网操作系统频道。

--结束END--

本文标题: Linux内存布局是怎样的

本文链接: https://lsjlt.com/news/318673.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux内存布局是怎样的
    这篇“Linux内存布局是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内存布局是怎样的”文章吧。我们先来看...
    99+
    2023-06-28
  • Linux内存申请是怎样的
    本篇内容主要讲解“Linux内存申请是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存申请是怎样的”吧!先上基础,下图是Linux的内存映射模型每一个进程都有自己的进程空间,进...
    99+
    2023-06-16
  • Linux IO内存的访问是怎样的
    本篇内容主要讲解“Linux IO内存的访问是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux IO内存的访问是怎样的”吧!IO内存访问流程我们知道,为了管理最重要的系统资源并让物...
    99+
    2023-06-16
  • 浅析C++内存布局
    目录虚拟内存 类的实例化对象所占的内存空间空类的实例化对象占1一个字节 类的成员函数不占用类对象的内存空间类的成员变量占用类对象的内存空间字节对齐原则虚拟内存&n...
    99+
    2024-04-02
  • Java中对象的内存布局
    这篇文章主要讲解了“Java中对象的内存布局”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中对象的内存布局”吧!作为一名Java程序员,我们在日常工作中使用这款面向对象的编程语言时,...
    99+
    2023-06-15
  • 网页布局中CSS布局调试的有效方法是怎样的
    网页布局中CSS布局调试的有效方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。网页布局中CSS布局调试...
    99+
    2024-04-02
  • 详解Java对象的内存布局
    目录前言对象内存构成对象头实例数据对齐数据结尾前言 今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synchroniz...
    99+
    2024-04-02
  • Linux内核是怎样的
    这篇文章主要介绍“Linux内核是怎样的”,在日常操作中,相信很多人在Linux内核是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-05
  • 怎么在Java中布局对象内存
    怎么在Java中布局对象内存?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实...
    99+
    2023-06-14
  • Java对象存储内存布局详解
    目录Java对象存储内存布局Java对象的访问定位Java对象的创建过程Java对象分配内存是否线程安全Java类实例化顺序Java对象存储内存布局 众所周知,Java是一门面向对象...
    99+
    2023-05-18
    Java对象存储内存布局 Java内存布局 Java对象内存
  • Java对象的内存布局全流程
    目录对象内存布局对象占用内存空间证明对象内存布局开始先抛出一个问题:一个对象o,Object o = new Object();创建完成后会占用多少字节的内存? 要能回答这个问题,就...
    99+
    2024-04-02
  • Linux内核是怎么样的
    这篇文章将为大家详细讲解有关Linux内核是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘Linux 内核看不见摸不...
    99+
    2023-06-16
  • Java对象在内存中的布局是如何实现的?
    1、-XX:FieldsAllocationStyle 对象在内存中的布局首要相关配置就是FieldsAllocationStyle,这个配置有3个可选值,即0、1、2。当值为2的时...
    99+
    2024-04-02
  • 移动设备HTML5页面布局是怎样的
    本篇文章给大家分享的是有关移动设备HTML5页面布局是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结合移动设备(手机和平板电脑)的特性...
    99+
    2024-04-02
  • JS、flex 、column实现瀑布流布局的方式是怎样的
    这篇文章将为大家详细讲解有关JS、flex 、column实现瀑布流布局的方式是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、JS 实现瀑布流思路分析瀑布流布局的特点是等宽不等高。...
    99+
    2023-06-22
  • JVM内存的结构是怎样的
    这篇文章主要介绍“JVM内存的结构是怎样的”,在日常操作中,相信很多人在JVM内存的结构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存的结构是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • Java对象的内存布局详细介绍
    目录一、对象头1)、Mark Word2)、类型指针3)、数组长度(只有数组对象才有)二、实例数据三、对齐填充四、使用JOL工具分析对象内存布局在HotSpot虚拟机中,对象在内存中...
    99+
    2023-02-13
    Java对象内存布局 Java内存布局 Java对象内存
  • 怎么在java中创建一个内存布局
    本篇文章给大家分享的是有关怎么在java中创建一个内存布局,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. And...
    99+
    2023-06-14
  • Python的对象拷贝和内存布局怎么实现
    前言你知道下面一些程序片段的输出结果吗?a = [1, 2, 3, 4] b = a print(f"{a = } \t|\t {b = }") a[0] = 100 print(f"{a = } \t|\t ...
    99+
    2023-05-15
    Python
  • linux内核结构是怎样的
    Linux内核是一个分层的结构,由多个模块组成,每个模块负责不同的功能。下面是Linux内核的主要组成部分:1. 进程管理模块:负责...
    99+
    2023-10-08
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作