Linux进程的虚拟地址空间.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux进度的虚构地点空间 在x86体系构造中分段体制是必选的,而分页体制则可由详细的操作系统而选择,Linux经过让段的基地点为0而 巧妙的绕过了基地点。因此,对于Linux来说,虚地点和线性地点是一致的。在32位的平台上,线性地点的大小为固 定的4GB。并且,由于采用了保护体制,Linux内核将这4GB 分为两部分,虚地点较高的1GB(0xC0000000到 0xFFFFFFFF)为共享的内核空间;而较低的3GB 00xBFFFFFFF)为每个进度的用户空间。由于每个进度都不能直接接见内核空间,而是经过系统调用 间接进入内核,因此,所有的进度都共享内核空间。而每个进度都拥有各自的用户空间,各个进度之间不能互相接见彼此的用户空间。因此,对于每一个详细的进度而言,都拥有 4GB的虚构地点空间。一个程序在经过编译、连结之 后形成的地点空间是一个虚构的地点空间,只有当程序运行 的时候才会分派详细的物理空间。由此我们能够得悉,程序 的虚构地点相对来说是固定的,而物理地点则随着每一次程 序的运行而有所不同。对于内核空间而言,它与物理内 存之间存在一个简单的线性关系,即存在3GB的偏移量。 在Linux内核中,这个偏移量叫做PAGE_OFFSET。如果内核的某个物理地点为x,那么对应的内核虚地点就为 x+PAGE_OFFSET。对于用户空间而言,它与物理内存 之间的映射远不止这么简单。与内核空间和物理空间的线性 映射不同的是,分页体制将虚构用户空间和物理地点空间分 成大小相同的页,然后再经过页表将虚构页和物理页块映射 起来。内核空间一般能够经过__get_free_page( )、 kmalloc( )和vmalloc( )来申请内核空间。只可是 __get_free_page函数每次申请的都是完整的页;尔后两者 则依据详细参数申请以字节为单位的内存空间。别的,前两 个函数申请的虚构地点空间和物理地点空间都是连续的; vmalloc函数申请的物理地点空间并不连续。vmalloc函数通 过从头成立虚构地点空间和物理地点空间之间的映射,即新 建页表项,将离散的物理地点空间映射到连续的虚构地点空 间。因此,使用该函数的开销比较大。下面的程序简单 的演示了这三个函数的使用方法。从结果中能够看出,这些 函数申请的地点都在3GB(0xBFFFFFFF)以上。完整代码 在如下。 staticint__initmenroyshow_init(void) {printk(mmshowmoduleis working\n);pagemem= __get_free_page(GFP_KERNEL);if(!pagemem) goto gfp_fail;printk(KERN_INFOpagemem= 0x%lx\n,pagemem); kmallocmem= kmalloc(100*sizeof(char),GFP_KERNEL); if(!kmallocmem) gotokmalloc_fail; printk(KERN_INFOkmallocmem=0x%p\n,kmallocmem); vmallocmem= vmalloc(1000000*sizeof(char)); if(!vmallocmem) gotovmalloc_fail; printk(KERN_INFOvmallocmem =0x%p\n,vmallocmem); return0; gfp_fail: free_page(pagemem); kmalloc_fail: kfree(kmallocmem); vmalloc_fail: vfree(vmallocmem); return-1; } //运行结果: #pagemem=0xf3211000 # kmallocmem=0xd581e700 #vmallocmem= 0xf9251000 每个进度够拥有属于自己的 3GB的虚构 空间(用户空间),那么这个3GB的空间是怎样区分的?往常, 除了我们熟悉的代码段和数据段,用户空间还包括堆栈段和 堆。我们能够经过下面的演示程序来认识这些地区到底负责 存储程序的那些内容。  int bss_var;intdata_var0=1;argv){printf(The  intmain(intargc,char userspacesaddressdivisionofaprocessasfollow:\n);printf(Data segment:\n);printf(addressof\main\ function:%p\n\n,main); printf(Datasegment:\n);printf(addressof data_var:%p\n,amp;data_v

文档评论(0)

151****6617 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档