快速业务通道

Linux关于地址空间和MMAP映射

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-24

  Linux采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存.对每个进程来说,它们好像都可以访问整个系统的所有物理内存.更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存.

  进程地址空间由每个进程中的线性地址区组成,每个进程都有一个32位或64位的平坦(flat) 空间,空间的具体大小取决于体系结构.“平坦”指地址空间范围是一个独立的连续区间.通常情况下,每个进程都有唯一的这种平坦空间,每个进程的地址空 间之间彼此互不相干.两个不同的进程可以在它们各自地址空间的相同地址内存存放不同的数据.但是进程之间也可以选择共享地址空间,我们称这样的进程为线程.

  在地址空间中,我们更为关心的是进程有权访问的虚拟内存地址区间,比如08048000~0804c000.这些可被访问的合法地址区间被成为内存区域(memory area),通过内核,进程可以给自己的地址空间动态地添加或减少内存区域.

  进程只能访问有效范围内的内存地址.每个内存区域也具有相应进程遵循的特定访问属性,如只读、只写、可执行等属性.如果一个进程访问了不在有效范围中的地址,或以不正确的方式访问有效地址,那么内核就会终止该进程,并返回“段错误”信息.

  <!--[if !supportLists]-->? <!--[endif]-->内存区域可以包含各种内存对象,如下:

  <!--[if !supportLists]-->? <!--[endif]-->可执行文件代码的内存映射,成为代码段(text section).

  <!--[if !supportLists]-->? <!--[endif]-->可执行文件的已初始化全局变量的内存映射,成为数据段(data section).

  <!--[if !supportLists]-->? <!--[endif]-->包含未初始化全局变量的零页(也就是bss段)的内存映射.零页是指页面中的数据全部为0.

  <!--[if !supportLists]-->? <!--[endif]-->用于进程用户空间栈的零页的内存映射.

  <!--[if !supportLists]-->? <!--[endif]-->每一个诸如C库或动态链接程序等共享库的代码段、数据段和bss也会被载入进程的地址空间.

  <!--[if !supportLists]-->? <!--[endif]-->任何内存映射文件.

  <!--[if !supportLists]-->? <!--[endif]-->任何共享内存段.

  <!--[if !supportLists]-->? <!--[endif]-->任何匿名的内存映射,比如由malloc()分配的内存.

  进程地址空间的任何有效地址都只能位于唯一的区域,这些内存区域不能相互覆盖.可以看到,在执行的进程中,每个不同的内存片断都对应一个独立的内存区域:栈、对象代码、全局变量、被映射的文件等等.

  内核使用内存描述符表示进程的地址空间.内存描述符由mm_struct结构体表示,定义在文件<linux/sched.h>中,该结构包含了和进程地址空间有关的全部信息.

  VMA

  内存区域由vm_area_struct结构体描述,定义在文件<linux/mm.h>中,内存区域在内核中也经常被称作虚拟内存区域或者VMA.

  VMA标志是一种位标志,它定义在vm_area_struct结构中(该结构中的vm_flags子域).和物理页的访问权限不同,VMA标志反映了内核处理页面索需要遵守的行为准则,而不是硬件要求.VM_IO标志内存区域中包含对设备I/O空间的映射.该标志通常在设备驱动程序执行mmap()函数进行I/O空间映射时才被设置,同时该标志也表示该内存区域不能被包含在任何进程的存放转存(core dump)中.VM_RESERVED标志内存区域不能被换出,它也是在设备驱动程序进行映射时被设置.

  vm_area_struct结构体中的vm_ops域指向与指定内存区域相关的操作函数表,内核使用表中的方法操作VMA.

  mmap()和do

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号