第4章 内存管理ppt课件

上传人:我*** 文档编号:149210744 上传时间:2020-10-25 格式:PPT 页数:51 大小:202.50KB
返回 下载 相关 举报
第4章 内存管理ppt课件_第1页
第1页 / 共51页
第4章 内存管理ppt课件_第2页
第2页 / 共51页
第4章 内存管理ppt课件_第3页
第3页 / 共51页
第4章 内存管理ppt课件_第4页
第4页 / 共51页
第4章 内存管理ppt课件_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《第4章 内存管理ppt课件》由会员分享,可在线阅读,更多相关《第4章 内存管理ppt课件(51页珍藏版)》请在金锄头文库上搜索。

1、第4章 内存管理,第4章 内存管理,本章介绍Linux内存管理子系统的整体概念,讨论存储层次结构、x86存储管理硬件和Linux虚存系统及相关系统工具。,4.1存储层次结构和x86存储管理硬件,4.1.1内存管理基本框架 Linux内核的设计要考虑到在各种不同的微处理器上的实现,所以不能仅仅针对i386结构来设计它的映射机制,而要以虚拟的微处理器和内存管理单元MMU(Memory Management Unit)为基础,设计出一种通用的模式,再将其分别落实到具体的微处理器上。Linux在内存管理的软件实现方面,提供了不同的接口,可以用于各种各样不同地址线宽度的CPU。,Intel 的80386

2、提供了两层影射的页式内存管理的件支持,一层是页面目录称为PGD(Page Directory),另一层是页表称为PT(Page Tables),PT的表项称为PTE(Page Table Elements)。通过它们实现从线性地址到物理地址的转换。这种两层影射方式对于32位地址线的386是很合适的。但Linux要设计成可在不同的CPU下运行,考虑到大于32位地址线宽度的CPU(例如64位的CPU),Linux内核的映射机制被设计成3层,在页面目录和页表之间增设了一层“中间目录”PMD(Page Mid-level Directory)在逻辑上,相应地也把线性地址从高到低分为4个位段,各占若干位

3、,分别用作目录PGD的下标、中间目录PMD的下标、页表中的下标和物理页面内的位移。如图4.1所示。PGD、PMD、PT都是数组。Page Frame是最后得到的物理页。,三层影射过程如下: (1)从控制寄存器CR3中找到页目录的基址。 (2) 以线性地址的最高位段作为下标在PGD中找到确定中间目录的表项的指针。 (3) 以线性地址的次位段作为下标在PMD中找到确定页面表的表项的指针。 (4) 在线性地址的接下来位段为下标在PTE中找到页的指针。 (5) 最后线性地址的位段中为在此页中偏移量。 这样,最终完成了线性地址到物理地址的转换。,假如当要执行某个函数的第一个句子时,CPU会通过32位地址

4、线寻址(2的32次方,可以寻址4G的线性地址空间)。通过MMU执行以上的影射过程,就会在计算机的内存中找到这个句子的物理地址,如果要找的那一句不在物理页中,就会发生一次异常中断,使硬盘和内存发生交互。 在Linux原码的 include/asm-i386/pgtable.h 定义了能够包容不同CPU的接口: # if CONFIG_X86_PAE /假如在PAE模式下,用三层影射结构 #include #else #include /否则用两层 #endif 在pgtable-2level.h中定义了PGD,PMD的结构。 #define PGDIR_SHIFT 22 /页目录是线性地址的31

5、22位 #define PTRS_PER_PGD 1024 /总共有1024个页目录 #define PMDIR_SHIFT 22 /中间目录不用了 #define PTRS_PER_PMD 1 #define PTRS_PER_PTE1024 /每个页表有1023页,在32位线性地址中的4G虚拟空间中,其中有1G做为内核空间,从0XC0000000到0XFFFFFFFF。每个进程都有自己的3G用户空间,它们共享1G的内核空间。当一个进程从用户空间进入内核空间时,它就不在有自己的进程空间了。 在物理空间中,内核总是从0地址开始的,而在虚拟空间中是丛0XC0000000开始的。内核中的影射是很简

6、单的线性影射,所以0XC0000000就是两者的偏移量。 在page.h中: #define_PAGE_OFFSET (0 xc0000000) #definePAGE_OFFSET (unsigned long ) _PAGE_OFFSET ) #defne _pa(x) ( (unsigned lonsg) (x) PAGE_OFFSET) / 内核虚拟地址转换到物理地址 #define _va(x) (void *) (unsigned long) (x) + PAGE_OFFSET) / 内核从物理地址到虚拟地址的转换 对i386微处理器来说,CPU实际上不是按3层而是按两层的模型来进

7、行地址映射,这就需要将虚拟的3层映射落实到具体的两层的映射,跳过中间的PMD层次。,4.1.2地址映射的全过程 80386有实方式和保护方式两种工作方式。尽管实方式下80386的功能较Intel先前的微处理器有很大的提高,但只有在保护方式下,80386才能真正发挥作用。在保护方式下,全部32根地址线有效,可寻址达4G字节的物理空间。扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能快速的进行任务切换和任务保护环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码及数据的安全和保密及任务的隔离;

8、支持虚拟8086方式,便于执行8086代码。,(1) 80386 保护方式的寻址 在保护方式下,当寻址扩展内存中的数据和程序时,仍然使用偏移地址访问位于存储器内的信息,但保护方式下的段地址不再像实方式那样有段寄存器提供,而是在原来存放段地址的段寄存器里含有一个选择子,用于选择描述符表内的一个描述符。描述符描述存储器的位置、长度和访问权限。 保护方式下有两个描述符表:全局描述符表和局部描述符表。全局描述符表包含适用于所有程序的段定义,而局部描述符表通常用于唯一的应用程序。每个描述符表包含8129个描述符,所以任何时刻应用程序最多可用16384个描述符。 每个描述符长8字节,全局和局部描述符表每个

9、最长为64kb。 分页机制式存储管理机制的第二部分。分页机制在段机制之后进行操作,以完成虚拟地址到物理地址的转换。段机制把虚拟地址转换为线性地址,分页机制进一步把线性地址转换为物理地址。 分页机制由微处理器中控制寄存器的内容控制。分页机制由CRO中的PG位启用。若PG=1,启用分页机制。PG=0,不用分页机制,直接把段机制生成的线性地址当作物理地址。 软件生成的线性地址分为三部分,分别用于页目录项、页表项和页偏移地址寻址。,(2) Linux所采用的方法 i386微处理器一律对程序中的地址先进行段式映射,然后才能进行页式映射。而Linux为了减小footprint,提高cache命中率,尽量避

10、免使用段功能以提高可移植性。如通过使用基址为0的段,使逻辑地址等于线性地址。因此Linux所采用的方法实际上使i386的段式映射的过程不起作用。 下面通过一个简单的程序来看看Linux下的地址映射的全过程: #include greeting() printf(“Hello world!”); main() greeing(); ,该程序在主函数中调用greeting 来显示“Hello world!”,经过编译和反汇编的结果如下。 08048568: 8048568: 55push1 %ebp 8048856b:89 e5 mov1 %esp,%ebp 804856b: 68 04 94 0

11、4 08push1 $0 x8048404 8048570: e8 ff fe ff ffcall 8048474 8048575: 83 c4 04add1 $0 x4,%esp 8048578: c9leave 8048579: c3ret 804857a: 89 f6 mov1 %esi,%esi 0804857c : 804857c: 55push1 %ebp 804857d: 89 e5 mov1 %esp,%ebp 804857f: e8 e4 ff ff ffcall 8048568 8048584: c9leave 8048585: c3ret 8048586: 90nop 8

12、048587: 90nop,从上面可以看出,greeting()的地址为0 x8048568。在elf格式的可执行代码中,总是在0 x8000000开始安排程序的“代码段”,对每个程序都是这样。 程序在main中执行到了“call 8048568”这条指令,要转移到虚拟地址8048568去。 首先是段式映射阶段。地址8048568是一个程序的入口,更重要的是在执行的过程中由CPU的EIP所指向的,所以在代码段中。I386cpu使用CS的当前值作为段式映射的选择子。 内核在建立一个进程时都要将它的段寄存器设置好,把DS、ES、SS都设置成_USER_DS,而把CS设置成_USER_CS,这也就是

13、说,在Linux内核中堆栈段和代码段是不分的。 Index TI DPL #define_KERNEL_CS 0 x100000 0000 0001 0|0|00 #define_KERNEL_DS 0 x180000 0000 0001 1|0|00 #define_USER_CS 0 x230000 0000 0010 0|0|11 #define_USER_DS 0 x2B0000 0000 0010 1|0|11 _KERNEL_CS: index=2,TI=0,DPL=0 _KERNEL_DS: index=3,TI=0,DPL=0 _USERL_CS:index=4,TI=0,DP

14、L=3 _USERL_DS:index=5,TI=0,DPL=3,TI全都是0,都使用全局描述表。内核的DPL都为最高级别0;用户的DPL都是最低级别3。_USER_CS在GDT表中是第4项,初始化GDT内容的代码如下: ENTRY(gdt-table) .quad 0 x0000000000000000 / NULL descriptor .quad 0 x0000000000000000 / not used .quad 0 x00cf9a00000ffff / 0 x10 kernel 4GB code at 0 x00000000 .quad 0 x00cf9200000ffff /

15、0 x18 kernel 4GB data at 0 x00000000 .quad 0 x00cffa00000ffff / 0 x23 user 4GB code at 0 x00000000 .quad 0 x00cff200000ffff / 0 x2b user 4GB data at 0 x00000000 GDT 表中第1、2项不用,第3至第5项共4项对应于前面的4个段寄存器的数值。将这4个段描述项的内容展开: K_CS:0000 0000 1100 1111 1001 1010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111

16、K_DS:0000 0000 1100 1111 1001 0010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 U_CS:0000 0000 1100 1111 11111 1010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 U_DS:0000 0000 1100 1111 1111 0010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 这4个段描述项的下列内容都是相同的。,BO-B15/B16-B31 都是0 基地址全为0 LO-L15、L16-L19都是1 段的界限全是0 xfffff G位都是1 段长均为4KB D位都是1 32位指令 P位都是1 四个段都在内存中 不同之处在于权限级别不同,内核的为0级,用户的为3级。 由此可知,每个段都是从地址0开始的整个4GB地虚存空间,虚地址到线性地址的映射保持原值不变。 再回到greeting 的程序中来,通过

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号