您现在的位置:首页 » 新闻动态 » 公司新闻 公司新闻
Linux内存管理详细解析
发布日期:2016-08-03

      首先理清物理地址、虚拟地址、线性地址、逻辑地址几个概念。

      物理地址:又被称为绝对地址,指SDRAM的地址。例如ARM9的平台使用64M内存,则内存的物理地址就是从0x30000000到0x34000000

      虚拟地址:又被称为线性地址,32bit的整数表示0-4G的地址空间

      逻辑地址:又被称为相对地址,在X86中使用段偏移的方式来表示指令或是数据的地址

      MMU是Memory Management Unit的缩写,中文名是内存管理单元。CPU要将一个逻辑地址转换为物理地址,需要两步:首先CPU利用段式内存管理单元,将逻辑地址转换成线程地址,再利用页式内存管理单元,把线性地址最终转换为物理地址。

      Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间,该空间是块大小为3G的线性虚拟空间。用户所看到和接触到的都是虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可使用比实际物理内存更大的地址空间。

      第一、4G的进程地址空间被人为的分为两个部分——用户空间与内核空间。用户空间从0到3G(0xC0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址。只有用户进程进行系统调用或产生中断(代表用户进程在内核态执行)等时刻可以访问到内核空间。

     第二、用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。

     第三、每个进程的用户空间都是完全独立、互不相干的。

     Linux内存管理系统的主要任务有两个:一是实现虚拟地址和物理地址的映射;二是完成物理内存的分配。

     地址映射

     管理模型如下:

      从上图可以看出,虚拟地址(线性地址)分为用户空间和内核空间,其中内核空间又分为四个区:直接映射区、vmalloc区、永久内核映射区、固定映射区。这四个区的虚拟地址映射到物理地址的方式不同,所以将内核空间分为了四个区。

      从上图可以看出,无论是用户空间还是内核空间(除去固定映射区),将虚拟地址映射到物理地址,首先是根据虚拟地址和进程页目录找到对应的进程页表或者内核页表,然后再根据页表找到对应的物理页(也叫页框,对于32位cpu来说,大小固定为4KB),再在物理页中找到对应的物理地址。概括的说,地址的转换工作需要通过查询页表才能完成,地址转换需要将虚拟地址分段,使每段虚地址都作为一个索引指向页表,而页表项则指向下一级别的页表或者指向最终的物理页面。如下图所示。

      得到一个虚拟地址后,将该地址分为DIRECTORY,TABLE,OFFSET三段。首先根据cr3得到页目录的基地址,该基地址加上DIRECTORY后,可以从页目录中找到页表的基地址;页表基地址加上TABLE,可以从页表中找到页的基地址;页的基地址加上偏移量OFFSET可以找到对应的物理地址。

      上面说过,内核的四个区的虚拟地址映射到物理地址的方式不同,不同之处在于:

      ①线性空间中从3G开始最大896M的区间,为直接内存映射区。直接映射区中,虚拟地址与物理地址的映射很简单,物理地址等于虚拟地址减去0xc0000000,即虚拟地址减去3G,如虚拟地址为0xc0008000,则对应的物理地址为0x00008000。直接映射区的虚拟地址范围为0xc0000000-0xf8000000,即其占的虚拟空间为896MB。896MB是一个重要的界限,对于物理内存来说,低于896MB的物理内存空间称为低端内存,高于896MB的空间称为高端内存

      ②vmalloc区由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理空间不一定连续。vmalloc区既能访问到低端内存,也能访问到高端内存。在这一区中的虚拟地址与物理地址的映射较为复杂

      ③永久内核映射区用于访问高端内存

      ④固定映射区的虚拟地址与一些固定的寄存器建立了映射关系,可以访问到固定寄存器。

      物理内存的分配

      上图为内存管理分配物理内存的示意图。

      创建进程等进程相关操作都需要分配内存给进程。这时进程申请和获得的不是物理地址,仅仅是虚拟地址。实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请页机制”产生“缺页”异常,从而进入分配实际页框的程序。该异常是虚拟内存机制赖以存在的基本保证——它会告诉内核去为进程分配物理页,并建立对应的页表,这之后虚拟地址才实实在在的映射到了物理地址上。

      用户空间的程序必须通过“请页机制”产生“缺页”异常才能获取物理地址,而内核程序如果通过vmalloc函数分配空间,则也需要“请页机制”产生“缺页”异常才能获取物理地址,如果是通过kmalloc函数分配空间,则返回的虚拟地址已经和物理地址映射好了,也就是说已经分配到了物理地址

  • 1.公司登记注册于2003年1月27日,清远市桑达电子网络媒体有限公司
    2.公司2006年起成为清远市政府定点协议供货商,电子采购供货商
    3.公司2007年被清远市相关政府部门评为安防行业状元
    4.公司2007年起成为长城电脑清远如意服务站(SP368)
    5.公司2007年承建清远市横河路口电子警察工程,开创清远电子警察先河。
  • 6.公司2007年起成为IBM合作伙伴、公司2010年底成为金蝶软件清远金牌代理(伙伴编号:30030013)
    7.公司组团队参加南方都市报组织的创富评选,获广东80强。公司申请多项软件著作权、专利权
    8.2016年起公司成为粤东西北地区为数不多的双软企业,确立“让软件驱动世界,让智能改变生活!"企业理想
    9.2016-01-29更名为广东互动电子网络媒体有限公司
    10.2021-01-13更名为广东互动电子有限公司
  • 投资合作咨询热线电话:0763-3391888 3323588
  • 做一个负责任的百年企业! 天行健,君子以自强不息;地势坤,君子以厚德载物;
    为用户创造价值! 让软件驱动世界; 让智能改变生活; 超越顾客期望,帮助顾客成功;
    对客户负责,对员工负责,对企业命运负责!帮助支持公司的客户成功;帮助忠诚于公司的员工成功!
  • 联系电话:0763-3391888 3323588 3318977
    服务热线:18023314222 QQ:529623964
  • 工作QQ:2501204690 商务QQ: 602045550
    投资及业务投诉QQ: 529623964
    微信:小米哥 微信号:qysed3391888
    腾讯微博:桑达网络-基石与起点
  • E-MAIL:222#QYSED.CN ok3391888#163.com (请用@替换#)
在线客服
  • 系统集成咨询
    点击这里给我发消息
  • 网站\微信\软件咨询
    点击这里给我发消息
  • 售后服务
    点击这里给我发消息
  • 投资合作
    点击这里给我发消息