返回顶部
首页 > 资讯 > 操作系统 >Linux内存管理和寻址详细介绍
  • 801
分享到

Linux内存管理和寻址详细介绍

Linux内存管理linux内存寻址 2022-06-04 23:06:51 801人浏览 八月长安
摘要

目录1.概念内存管理模式地址类型划分说明:2.页式管理x86架构32位cpux86架构 64位cpu3.地址划分4. 调试程序寄存器示例一个内核宕机的日志:查看程序寄存器段寄存器有0x23和0x2b两

目录
  • 1.概念
    • 内存管理模式
    • 地址类型划分
    • 说明:
  • 2.页式管理
    • x86架构32位cpu
    • x86架构 64位cpu
  • 3.地址划分
    • 4. 调试
      • 程序寄存器
      • 示例一个内核宕机的日志
      • 查看程序寄存器
      • 段寄存器有0x23和0x2b两种情况:
    • 结语

      1.概念

      内存管理模式

      段式:内存分为了多段,每段都是连续的内存,不同的段对应不用的用途。每个段的大小都不是统一的,会导致内存碎片和内存交换效率低的问题。

      页式:内存划分为多个内存页进行管理,如在 linux 系统中,每一页的大小为 4KB。由于分了页后,就不会产生细小的内存碎片。但是仍然也存在内存碎片问题。

      段页式:段式和页式结合。

      地址类型划分

      逻辑地址:程序所使用的地址,通常是没被段式内存管理映射的地址,称为逻辑地址

      线性地址:通过段式内存管理映射的地址,称为线性地址,也叫虚拟地址

      虚拟地址:通过段式内存管理映射的地址,称为线性地址,也叫虚拟地址

      物理地址:物理内存地址

      说明:

      Inetel处理器中,逻辑地址是「段式内存管理」转换前的地址,线性地址则是「页式内存管理」转换前的地址。

      段式内存管理映射而成的地址不再是“物理地址”了,Intel 就称之为“线性地址”(也称虚拟地址)。于是,段式内存管理先将逻辑地址映射成线性地址,然后再由页式内存管理将线性地址映射成物理地址。

      linux内存主要是页式内存管理,同时也有涉及段式机制。当前Linux内核所采取的办法是使段式映射的过程实际上不起什么作用。

      Intel最早处理器80286是纯段式管理,80386段式和页式均存在。

      Linux内存管理和寻址详细介绍

      2.页式管理

      x86架构32位cpu

      ​ 二级页表选址方式,一个内存页4KB大小,一级页目录表1024项,二级页表1024项,一个页表项4字节。一级页目录表项全部分配,二级页表在需要的时候创建。(局部性原理)。

      虚拟地址32位

      10+10+12,分别索引1级页表号,2级页表项,记录物理基地址的偏移地址。使用PAE机制之后32bit系统支持最大的内存是64GB(地址是32+4=36位)。

      线性地址寻址物理地址步骤

      先根据10位寻址1级页表号,1级页表号中记录了2级页表的地址

      找到2级页表地址后,接着根据虚拟地址的另10位寻找2级页表中表项的位置

      找到2级页表的表项之后,表项中记录了该虚拟地址映射物理地址的起始地址,表项的大小是4字节32bit

      根据找到的物理地址的起始地址结合虚拟地址的后12位作为偏移计算出最终的物理地址

      Linux内存管理和寻址详细介绍

      x86架构 64位cpu

      存在更多级页表

      全局页目录项 PGD(Page Global Directory上层页目录项 PUD(Page Upper Directory)中间页目录项 PMD(Page Middle Directory)页表项 PTE(Page Table Entry)

      线性地址寻址物理地址步骤

      线性地址为48bit,最大物理地址为52bit,实际物理内存地址总线宽度是40bit,也就是支持1TB物理内存x86_64有四级页表,原理同x86系统,也是一层层的寻址CR3寄存器保存最高层一级表的起始物理地址,因此寻址首先就是要获取到CR3寄存器中的值每个PTE表项的大小是8个字节也就是64bit

      Linux内存管理和寻址详细介绍

      TLB

      在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TL(Translation Lookaside Buffer) 。通常称为页表缓存、转址旁路缓存、快表等。那么在CPU的内存管理单元MMU寻址时,会先查 TLB,如果没找到,才会继续查常规的页表。

      专有名词

      PDT:页目录表,多级页表一级页表,32bit系统有1024个页目录
      PTT:页表项表,多级页表二级页表,32bit系统有每个页目录下有1024个页表项,每个表项4个字节
      PDE:页表的基址,是PDT中一项
      PTE:是页的基址,是PTT中一项
      GDT:全局描述符表,逻辑地址转为线性地址用到
      LDT:局部描述符表,逻辑地址转为线性地址用到

      Linux内存管理和寻址详细介绍

      3.地址划分

      32系统
      内核1G: 0xC0 00 00 01 - 0xFF FF FF FF
      用户3G: 0x00 00 00 00 - 0xC0 00 00 00
      0xC0 00 00 00 == 3G

      64位系统:
      内核128T: 0xFF FF 80 00 00 00 00 00 - 0xFF FF FF FF FF FF FF FF (高位)
      0xFF FF 7F FF FF FF FF FF - 0xFF FF FF FF FF FF FF FF(自己计算)

      用户128T: 0x00 00 00 00 00 00 00 00 - 0x00 00 7F FF FF FF FF FF (低位)
      0x00 00 80 00 00 00 00 00 - 0x00 00 80 00 00 00 00 00 (自己计算)

      ​ 0x00 00 7F FF FF FF FF FF == 127T
      ​ 疑问:64位系统128T是分界线是127T?

      访问权限

      进程在用户态时,只能访问用户空间内存
      只有进入内核态后,才可以访问内核空间的内存

      PAE机制

      ​ CPU位宽指的是一个时钟周期内CPU能处理的二进制位数,普通场景中32位系统CPU的地址总线可以是32位,但是引入了PAE机制之后,16位CPU的地址总线位宽可以是20位(物理内存1M),32位CPU的地址总线可以是36位(物理内存64GB),64位CPU的地址总线位宽可以是40位(物理内存1TB)。因此我们不能简单的说32位系统只支持最大4GB的内存条。

      4. 调试

      程序寄存器

      cs:是代码段寄存器
      ds:是数据段寄存器
      ss:是堆栈段寄存器
      es:是扩展段寄存器
      fs:是标志段寄存器 32位之后才有
      gs:是全局段寄存器 32位之后才有

      示例一个内核宕机的日志:

      RIP: 0010:[] [] xxxxxxxxxx+0x69/0x70
      RSP: 0018:ffff886241737d98 EFLAGS: 00010246
      RAX: ffff880034814d40 RBX: ffff881fc6248740 RCX: 0000000000000200
      RDX: 0000000000000000 RSI: 0000000000000286 RDI: ffff881fc6381858
      RBP: ffff886241737d98 R08: ffff886241734000 R09: 0000000000000000
      R10: ffff880034814d40 R11: 0000000000000200 R12: ffff881fc62487a0
      R13: 0000000000000000 R14: 00007fff86cb6260 R15: ffff881fc6381858
      FS: 00007f78b59b8720(0000) GS:ffff885ffe3c0000(0000) knlGS:0000000000000000
      CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007f690a057180 CR3: 0000006208985000 CR4: 00000000003627e0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400

      查看程序寄存器

      使用GDB随意调试一个linux 32位上的ELF32的可执行文件,使用info r命令查看一下寄存器情况:

      Linux内存管理和寻址详细介绍

      段寄存器有0x23和0x2b两种情况:

      十六进制:0023
      二进制:0000000000100 0 11 - 段序号:4 - 表类型:GDT - 特权级:Ring3
      十六进制:002B
      二进制:0000000000101 0 11 - 段序号:5 - 表类型:GDT - 特权级:Ring3

      段序号:从第四位开始 表类型:第三位 特权级:第1、2位

      Linux下没有找到可以直接用什么命令或者工具查看GDT的方式,于是去源代码中寻找答案:

      Linux内存管理和寻址详细介绍

      看到了吗,这两项所描述的段和windows一样,基地址为0,大小为4GB。

      Windows和Linux都选择了通过这种方式架空了CPU的分段内存管理机制。

      但需要说明一下的时,虽然两个操作系统都是这种情况,但并不意味着段机制彻底没用到,CPU的任务管理TSS还是需要用到,这一点大家知道就行了,在linux64位系统下分段机制不被待见,但是操作系统仍然会保持先分段再分页的寻址方式。

      结语

      到此这篇关于Linux内存管理和寻址详细介绍的文章就介绍到这了,更多相关Linux内存管理和寻址内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

      --结束END--

      本文标题: Linux内存管理和寻址详细介绍

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

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

      猜你喜欢
      • Linux内存管理和寻址详细介绍
        目录1.概念内存管理模式地址类型划分说明:2.页式管理x86架构32位cpux86架构 64位cpu3.地址划分4. 调试程序寄存器示例一个内核宕机的日志:查看程序寄存器段寄存器有0x23和0x2b两...
        99+
        2022-06-04
        Linux内存管理 linux内存寻址
      • Linux内存管理和寻址的概念是什么
        本篇内容主要讲解“Linux内存管理和寻址的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存管理和寻址的概念是什么”吧!1.概念内存管理模式段式:内存分为了多段,每段都是连...
        99+
        2023-06-21
      • C++内存管理介绍
        目录1 smart_ptr概述1.1 RAII进制1.2 智能指针1.3 scoped_ptr1.4 scoped_array1.6 shared_array1.7 weak_ptr...
        99+
        2024-04-02
      • C++技术中的内存管理:内存管理工具和库的介绍
        c++++ 内存管理:内存管理工具:调试器用于识别内存错误;内存分析工具提供内存使用情况见解。内存管理库:智能指针自动管理内存分配和释放,例如 c++11 的 unique_ptr 和 ...
        99+
        2024-05-08
        c++ 内存管理
      • 详细介绍 PHP内存分配函数
        PHP 是一种流行的服务器端脚本语言,广泛用于 Web 开发。 与大多数编程语言一样,PHP 需要分配内存来创建变量、数组、对象和其他数据结构。 PHP 提供了几个分配函数来动态分配内存。 这些功能...
        99+
        2024-02-27
      • Linux用户空间与内核地址空间的详细介绍
        这篇文章主要介绍“Linux用户空间与内核地址空间的详细介绍”,在日常操作中,相信很多人在Linux用户空间与内核地址空间的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux用户空间与内核地址空...
        99+
        2023-06-15
      • Linux系统基本的内存管理知识介绍
        这篇文章主要介绍“Linux系统基本的内存管理知识介绍”,在日常操作中,相信很多人在Linux系统基本的内存管理知识介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统基本的内存管理知识介绍”的疑...
        99+
        2023-06-12
      • Java对象的内存布局详细介绍
        目录一、对象头1)、Mark Word2)、类型指针3)、数组长度(只有数组对象才有)二、实例数据三、对齐填充四、使用JOL工具分析对象内存布局在HotSpot虚拟机中,对象在内存中...
        99+
        2023-02-13
        Java对象内存布局 Java内存布局 Java对象内存
      • linux命令scp和sftp详细介绍
        linux命令scp和sftp详细介绍 1. 使用 scp 命令传输文件: 使用 scp 命令可以用来通过安全、加密的连接在不同主机之间传输文件。 (1)把本地文件传输到远程主机: 一般语法:scp [本地...
        99+
        2022-06-04
        详细介绍 命令 linux
      • JavaScript内存管理介绍是怎样的
        本篇文章为大家展示了JavaScript内存管理介绍是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大多数时候,我们在不了解有关内存管理的知识下也只开发,因为...
        99+
        2024-04-02
      • C语言动态内存管理介绍
        目录前言:C 语言为内存的分配和管理提供了几个函数:1.malloc() 用法2.calloc() 用法3.realloc() 与 free() 用法前言: 简单记录一下,内存管理...
        99+
        2024-04-02
      • Linux内存寻址的分段机制原理是什么
        这篇文章主要介绍“Linux内存寻址的分段机制原理是什么”,在日常操作中,相信很多人在Linux内存寻址的分段机制原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内存寻址的分段机制原理是什么...
        99+
        2023-06-12
      • C++内存管理详细解析
        目录一、C++内存管理1、 new/delete表达式2、new/delete重载3、类内自定义allocator(per-class allocator) 二、多线程内存分配器1、...
        99+
        2024-04-02
      • SpringBoot SpringSecurity 详细介绍(基于内存的验证)
        目录配置 Spring Security (入门)SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘SpringBoot已经...
        99+
        2023-05-18
        SpringBoot SpringSecurity SpringBoot SpringSecurity内存
      • C++的内存管理详细解释
        目录一、C/C++内存分布二、C语言中动态内存管理方式:1、malloc/calloc/realloc区别:三、C++中动态内存管理:new/delete四、实现原理五、面试常问问题...
        99+
        2024-04-02
      • Android11文件管理权限申请详细介绍
        目录Android 11文件管理权限申请Android 11和低版本的存储权限结合工具类封装Android 11申请管理所有文件权限的BugAndroid 11文件管理权限申请 An...
        99+
        2024-04-02
      • 关于C语言动态内存管理介绍
        目录1.为什么需要动态内存分配2.有关动态内存函数介绍2.1 malloc和free2.2 calloc函数2.3 realloc函数3. 常见的动态内存错误3.1 对NULL指针进...
        99+
        2024-04-02
      • 详解Linux内核内存管理架构
        内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求。本文从内存管理硬...
        99+
        2022-06-04
        Linux 内存 架构
      • 阿里云ECS4G内存的详细介绍及与其他内存的比较
        随着云计算的发展,阿里云作为国内领先的云服务商,提供了丰富的云产品和服务。其中,阿里云ECS( Elastic ComputeService)是其主要的云服务器产品之一。本文将详细介绍阿里云ECS4G内存的性能和特点,并与其他内存进行比较...
        99+
        2023-10-30
        内存 阿里 详细介绍
      • golang RPC包原理和使用详细介绍
        目录工作流程工作模式http模式服务器模式本篇文章旨在通过学习rpc包和github上的一个rpc小项目,熟悉和学习golang中各个包的使用 工作流程 通过阅读官方文档,了解了rp...
        99+
        2024-04-02
      软考高级职称资格查询
      编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
      • 官方手机版

      • 微信公众号

      • 商务合作