Linux 0.11 源码阅读笔记-内存管理

总览

内存管理

本人手工制作的 Linux 0.11 内存管理图解
mm

  • 虚拟内存的实现, 使用的是页面出错异常处理. 然后调用 do_no_page() 来读取硬盘数据(必要时先回写), 腾出内存空间.
  • 写时复制 (copy on write) 机制, 新建进程时, linux不会立刻复制进程数据.
    只有某个进程需要进行数据写操作时, 才真正开始执行复制操作.
    好处是, 节约内存, 加快创建进程的速度.
  • Linux 0.11版本的内存管理的主要文件 /mm/memory.c
  • 内存的一些基础概念请参考 Linux 0.11 源码阅读笔记-内存的基础概念

进程的内存空间

进程代码和数据在其逻辑地址空间中的分布
mm

  • Linux 0.11 每个进程只能有64M byte的逻辑内存.
  • 环境参数块最多128K
  • 堆栈指针是在逻辑地址的高位, 向下增长
  • bss是进程未初始化的数据段, 第一页会被初始化为0
  • 使用需求加载机制 (Load on demand), 因此在加载运行文件时, 只是分配64M的线性地址空间, 没有分配任何真正的物理内存.
  • 此时, 内核在执行代码或加载数据时, 会触发缺页异常中断, 此时才调用 do_no_page 加载内容到物理内存.

内存的分配 malloc

使用存储桶原理进行内存的分配管理
mm

  • 实现很巧妙. 指针应用的出神入化
  • 仅内核代码可以调用.
  • 基本思想: 对申请的不同的内存块大小, 使用存储桶分别进行处理.
  • 提高内存利用率, 可有效避免内存碎片化.
  • 源码文件 /lib/malloc.c

参考


原创于 DRA&PHO