我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

目录
  • 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内存管理和寻址内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

      免责声明:

      ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

      ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

      下载Word文档到电脑,方便收藏和打印~

      下载Word文档

      猜你喜欢

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

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

      Linux内存管理和寻址的概念是什么

      本篇内容主要讲解“Linux内存管理和寻址的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存管理和寻址的概念是什么”吧!1.概念内存管理模式段式:内存分为了多段,每段都是连
      2023-06-21

      C++技术中的内存管理:内存管理工具和库的介绍

      c++++ 内存管理:内存管理工具:调试器用于识别内存错误;内存分析工具提供内存使用情况见解。内存管理库:智能指针自动管理内存分配和释放,例如 c++11 的 unique_ptr 和 shared_ptr;boost 库提供更丰富的智能指
      C++技术中的内存管理:内存管理工具和库的介绍
      2024-05-08

      Linux用户空间与内核地址空间的详细介绍

      这篇文章主要介绍“Linux用户空间与内核地址空间的详细介绍”,在日常操作中,相信很多人在Linux用户空间与内核地址空间的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux用户空间与内核地址空
      2023-06-15

      Linux系统基本的内存管理知识介绍

      这篇文章主要介绍“Linux系统基本的内存管理知识介绍”,在日常操作中,相信很多人在Linux系统基本的内存管理知识介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统基本的内存管理知识介绍”的疑
      2023-06-12

      Linux磁盘管理中df命令详细介绍以及如何使用

      这篇文章给大家介绍Linux磁盘管理中df命令详细介绍以及如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.命令格式:du [选项][文件]2.命令功能:显示每个文件和目录的磁盘使用空间。3.命令参数:-a或-
      2023-06-13

      C++new与malloc和delete及free动态内存管理及区别介绍

      这篇文章主要介绍了深入理解C++中的new/delete和malloc/free动态内存管理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2022-12-19

      Maven分模块开发与依赖管理和聚合和继承及属性深入详细介绍

      依赖管理是项目管理中非常重要的一环。几乎任何项目开发的时候需要都需要使用到库。而这些库很可能又依赖别的库,这样整个项目的依赖形成了一个树状结构,而随着这个依赖的树的延伸和扩大,一系列问题就会随之产生
      2022-11-13

      编程热搜

      目录