linux内存管理子系统

Posted on 2015-02-16 17:35  Bumble_Bee  阅读(351)  评论(0编辑  收藏  举报

一、Linux内存管理模型
  1、虚拟地址与物理地址的映射
  2、物理地址的分配
二、虚拟地址与物理地址的映射
  1、虚拟地址空间分布
    32位处理器有32根地址总线,可访问4G的物理空间。其中有0-3G为用户程序空间,剩下3-4G为内核空间。内核空间又分为如下四个部分。
    A、直接映射区:3G-3G+896M
                该部分物理地址和虚拟地址之间的关系是很简单的线性关系。896这个数字很特殊,小于896M的空间称为低端内存空间,大于896M的空间为高端内存空间。
    B、vmalloc区:
      既可访问低端内存空间,又可访问高端内存空间。
    C、永久映射区:
      专门用来访问高端内存空间。
    D、固定映射区:
      和特殊的寄存器建立关系,其虚拟地址和物理地址的关系往往是固定的。
  2、虚拟地址与物理地址之间的映射
    这部分内容详见裸机部分MMU的总结。
三、物理内存分配(转自国嵌论坛)
  1、一般来说,在调用malloc函数、new函数等时会分配,但是linux略有不同。Linux采用的是虚拟地址管理,当分配到一段虚拟内存时,并不会分配物理内存与之对应。只有当访问这块内存时才会分配物理空间,避免浪费。
  2、当我们去访问这个虚拟地址,他会将其转换为物理地址,此时Linux内核发现没有与之对应的物理内存。于是引发缺页异常,再去看页框(页帧)有无空闲的物理内存,有的话就分配空闲的物理内存与虚拟地址建立对应关系。
  3、凡是缺页异常的都是先得到虚拟地址,并没有得到实际的物理内存。
  4、当在内核中调用kmalloc函数时,系统在分配虚拟内存时已经为它分配好了物理内存。