极客时间Linux操作系统(二)内存管理

一,内存管理

1,操作系统的内存管理分为三部分:

  • 物理内存的管理
  • 虚拟内存的管理
  • 虚拟地址和物理地址如何映射

2,虚拟空间分为两部分:

  • 内核空间
  • 用户空间

极客时间Linux操作系统(二)内存管理

  • Text segment存放二进制可执行代码的位置
  • data segment存放静态常量
  • bss segment存放未初始化的静态变量
  • 堆动态内存分配,往高地址增长
  • memory mapping segment:文件映射进内存,比如动态库
  • 栈往低地址增长

总结:

  1. 虚拟内存空间的管理,每个进程看到的都是独立的,互不干扰的虚拟地址空间
  2. 物理内存的管理,物理内存地址只有内存管理模块能够使用
  3. 内存映射,需要将虚拟内存和物理内存映射、关联起来

3,分段管理

(1)分段机制

极客时间Linux操作系统(二)内存管理

  • 虚拟地址 = 段选择子(段寄存器) + 段内偏移量
  • 段选择子 = 段号(段表索引) + 标识位
  • 段表 = 物理基地址 + 段界限(偏移量范围) + 特权等级

极客时间Linux操作系统(二)内存管理

如果要访问段2中偏移量600的虚拟地址,我们可以计算出物理地址=段2的基地址2000+偏移量600=2600

(2)Linux 分段实现

 

  • 段表称为段描述符表, 放在全局标识符表GDT中
  • Linux 将段基地址都初始化为 0, 并没有使用段的全部功能,不用于地址映射
  • Linux 分段功能主要用于权限检查

4,Linux 通过分页实现映射

  • 物理内存被换分为大小固定(4KB)的页, 物理页可在内存与硬盘间换出/换入,提高内存的利用率

极客时间Linux操作系统(二)内存管理

  • 页表 = 虚拟页号 + 物理页号; 用于定位页
  • 虚拟地址 = 虚拟页号 + 页内偏移

极客时间Linux操作系统(二)内存管理

  •  若采用单页表, 32位系统中一个页表将有 1M 页表项, 占用 4MB(每项 4B)
  • Linux 32位系统采用两级页表: 页表目录(1K项, 10bit) + 页表(1K项, 10bit) + (页大小(4KB, 12bit)),正好对应32位
  • 映射 4GB 内存理论需要 1K 个页表目录项 + 1K*1K=1M 页表项, 将占用 4KB+4MB 空间
  • 因为完整的页表目录可以满足所有地址的查询, 因此页表只需在对应地址有内存分配时才生成;
  • linux64 位系统采用 4 级页表

采用两级页表的好处

极客时间Linux操作系统(二)内存管理

总结:

  1. 虚拟内存空间的管理,将虚拟地址分成大小相等的页;
  2. 物理内存的管理,将物理内存分成大小相等的页;
  3. 内存映射,将虚拟内存和物理内存映射起来,并且在内存紧张的时候可以换出到磁盘