第五章 12 Linux内存管理.pptVIP

  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内存管理 Linux内存管理 Linux内核的设计并没有全部采用Intel所提 供的段机制,仅仅是有限度地使用了分段机 制。这不仅简化了Linux内核的设计,而且 为把Linux移植到其他平台创造了条件,因 为很多RISC处理器并不支持段机制。 Linux内存管理 所有段的基地址均为0 由此可以得出,每个段的逻辑地址空间范围为0- 4GB。因为每个段的基地址为0,因此,逻辑地址 到线性地址映射保持不变,在Linux中所提到的 逻辑地址和线性地址(或虚拟地址)指的也就是 同一地址。看来,Linux巧妙地把段机制给绕过 去了,而完全利用了分页机制。 Linux页式管理 前面介绍了i386的二级页管理架构,不过有 些CPU(Alpha 64位)使用三级,甚至四级架 构,Linux 2.6.29内核为每种CPU提供统一 的界面,采用了四级页管理架构,来兼容 二级、三级、四级管理架构的CPU。 Linux页式管理 Linux页式管理 这四级分别为: 1.页全局目录(Page Global Directory):即pgd,是多级页表的抽象最高层。 2.页上级目录(Page Upper Directory):即pud。 3.页中间目录(Page Middle Directory):即pmd,是页表的中间层。 4.页表(Page Table Entry):即pte。 虚拟内存 Linux操作系统采用虚拟内存管理技术,使 得每个进程都有独立的进程地址空间,该 空间是大小为3G,用户看到和接触的都是 虚拟地址,无法看到实际的物理地址。利 用这种虚拟地址不但能起到保护操作系统 的作用,而且更重要的是用户程序可使用 比实际物理内存更大的地址空间。 虚拟内存 Linux将4G的虚拟地址空间划分为两个部分——用户空间与内核空间。用户空间从0到0xbfffffff,内核空间从3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间。例外情况是用户进程通过系统调用访问内核空间。 用户进程地址空间(3G) 可执行程序存储结构 (1).text 存放 CPU 执行的机器指令,代码区通常是只读的,防止程序意外地修改了它的指令。 (2).data 该区包含被初始化的全局变量、静态变量.它们是在编译阶段被编译器存放在可执行目标文件的.data段中的. (3).BSS 未被初始化的全局变量和静态局部变量,编译的时候并未被分配空间,仅仅在.bss段中标记它们,当程序运行的时候才为它们在内存中分配空间,并把它们初始化为零或空指针(NULL)。 (4).rodata 该区包含常量数据(如字符串常量)在编译阶段被编译器存放在可执行目标文件的.rodata段中的。 编译后可执行代码 例:查看编译后可执行代码中几个基本段 #gcc -c neicunguanli.c -o neicunguanli #objdump –h neicunguanli 程序运行时内存结构 (1)代码区(text) 代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。 (2)全局初始化数据区/静态数据区(data): 只初始化一次 (3)未初始化数据区(BSS):在运行时改变其值。 (4)栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值等。 (5)堆区(heap):用于动态内存分配。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由 OS 回收。 程序执行时的内存分配情况 int a = 0; //a 在全局已初始化数据区 char *p1; //p1 在 BSS 区(未初始化全局变量) main() { int b; //b 在栈区 char s[] = abc; //s 为数组变量,存储在栈区, //“abc”为字符串常量,存储在已初始化数据区 char *p1,p2; //p1、p2 在栈区 char *p3 = 123456; //123456\0 data数据区,p3 在栈区 . static int c =0; //c为局部静态数据,data数据区 p1 = (char *)malloc(10); //分配得来的 10 个字节的区域在堆区 p2 = (char *)malloc(20); //分配得来的 20 个字节的区域在堆区 free(p1); free(p2); } 栈和堆的区别 (1)管理方式不同 栈编译器自动管理,无需程序员手工控制;而堆空间的申请释放工作由程序员控制,容易产生内存泄漏。 (2)空间大小不同。 栈是向低地址扩展的数据结构,是一块

文档评论(0)

xiaofei2001129 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档