ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

内核项目梳理(段页式内存管理)--读《操作系统真相还原》

2021-03-08 10:02:04  阅读:203  来源: 互联网

标签:物理地址 段页 内存 地址 -- 描述符 页表 CPU 内核


1.内存管理

  • 1.0 段式内存管理

    在保护模式下,段描述符是内存段的身份证。CPU在引用一个段时,都要先查看段描述符。很多时候,段描述符存在于描述表中(GDT或LDT),但于此对应的段并不在内存中,也就是说,CPU允许在描述符表中已经注册的段不在内存中,这就是它提供给软件使用的策略,我们利用它实现段式内存管理。

  • CPU加载内存段的过程

    段描述符中有个p位和A位,p位为1表示该段在内存中,CPU访问过该段后就会将段描述符中的A位置1,表示近来刚访问过该段。如果p位为0,表示该段不在内存中,CPU将抛出个NP异常(段不存在),进而去执行中断描述符表中NP异常对应的中断处理程序。此中断处理程序是操作系统负责提供的,该程序的工作是将相应的段从硬盘中载入内存,并将段描述符P位置1。中断处理函数结束后返回,CPU重复执行这个检测,进行查看该段描述符的P位,检查通过后,将段描述符的A位置1.

  • 内存段移出到外存的过程

    段描述符的A位由cpu置1,由操作系统清0.操作系统每发现该位为1后就将该位清0,在一个周期内统计该位为1的次数就知道该段的使用频率了,从而可以找出使用频率最低的段(LRU?)当物理内存不足时,可以将使用频率最低的段换出到硬盘,以腾出内存给新的进程。当段被换出到硬盘后,操作系统将该段描述符的P位置0.当下次这个进程上CPU运行后,如果访问了这个段,这样程序就回到了刚开始CPU检查出P位为0,紧接着抛出NP异常(段不存在),执行操作系统中断处理程序,换入内存段的循环。

  • 段式内存管理的优缺点

    • 优点

      通过将某些进程的段腾出内存的方法,解决了新进程因为内存不足而无法加载的问题。

    • 缺点

      进程段的大小不固定,如果段的大小比主机内存大,可能无法把段加载到内存执行,同时当段比较大时,将整个段换出到外存的IO操作太慢了。

    • 原因

      造成这种问题的原因是在只分段的情况下,线性地址(由编译器编译出来的地址,段地址+段内偏移地址称为线性地址,线性地址是唯一的,只能属于某一个线程)和物理地址是一一对应的,线性地址本身是连续的,这种一一对应关系造成了进程要使用的物理内存也必须是连续的。要解决这种问题,就要解除这种一一对应的关系,就可以通过某种映射关系,将某一段线性地址映射到物理地址。

      cpu就从硬件上提供了帮助,就是通过页表进行线性地址到物理地址的映射。

      分页机制本质上是将大小不同的大内存段拆分成大小相等的小内存块。

    • 1.1 页表

      页表的数据结构属于线性表,相当于页表项数组,可以通过索引直接访问成员

      • 1.1.0 获取物理内存

        效仿linux获取内核的方法,在linux 2.6内核中,是用detect_memory函数来获取内存容量的。其函数在本质上是通过调用BIOS中断0x15实现的,分别是BIOS中断 0x15的3个子功能,子功能号要存放到寄存器EAX或AX中,如下。

        • EAX = 0xE820: 遍历主机上全部内存
        • AX = 0xE801: 分别检测低15MB和16MB~4GB的内存,最大支持4GB
        • AH = 0x88: 最多检测出64MB内存,实际内存超过此容量也按照64MB返回
      • 1.1.1 二级页表

        把段地址+段内偏移地址称为线性地址,线性地址是唯一的,只能属于某一个线程。

        分页机制打开前要将页表地址(物理地址)加载到控制寄存器cr3中。同时在地址转换的过程中cpu是没有使用分页机制,是直接使用的物理地址,这是为了防止地址转换嵌套。

        每个进程都有自己的页表,进程一多,光是页表占用的空间就很多了。二级页表解决了动态创建页表,和减小页表长度的问题。

        在分页机制下,虚拟地址 = 线性地址

      • 1.1.2 cr3寄存器装载页表物理地址

      • 1.1.3 页目录表,页表,页目录项(pde)与页表项(pte)结构

        • 页目录表(1024 * 4,大小4kb)

        ... |
        -----|
        页目录项1|
        页目录项0|

        • 页表(1024 * 4,大小4kb)

        ... |
        -----|
        页表项1|
        页表项0|

        • 页目录项(大小4字节)
        11~9 8 7 6 5 4 3 2 1 0
        AVL G 0 D A PCD PWT US RW P
        • 页表项(大小4字节)
        11~9 8 7 6 5 4 3 2 1 0
        AVL G PAT D A PCD PWT US RW P
        • 符号意义

          • p=1 该页存在于物理内存中 p=0 该页不存在于物理内存中

          操作系统的页式虚拟内存管理就是通过P位和相应的pagefault异常来实现的

          RW 读写位 1为可读可写, 0表示可读不可写

          US 1为user普通用户位,特权级0,1,2,3都可以访问 0为Supervisor超级用户位,特权级3不可访问,0,1,2可以

          PWT 1表示该页为高速缓存,0为普通内存

          PCD 1该页启用高速缓存,0表示禁止将该页缓存

          A 1表示该页被内存访问过 和段描述符的p位可以一起实现段式虚拟内存访问,操作系统定期将A位清0,统计一段时间内变成1的次数(LRU?)

          D 当cpu对一个页面执行写操作时,就会设置对应页表项的D位为1

          PAT 页属性表位,能够在页面一级的粒度上设置内存属性。比较复杂,这里置0

          G Global全局位 为1表示是全局页,在高速缓存TLB中一直保存,给出虚拟地址就出物理地址,无那3部分转换

          AVL available位,操作系统可用该位,cpu不会理会。此处置0即可

      • 1.1.4 内存映射步骤(通过硬件自动完成,页部件)

        1. 32位虚拟地址转换为物理地址的过程
          • 1: 高10位是页目录项pde的索引,用于在页目录表中定位pde,处理器获取高10位后自动将其乘4,在加上页目录表的物理地址,这样就得到了pde索引对应的pde所在的物理地址(在cr3控制寄存器中有),然后自动在该物理地址中,即该pde中,获取保存的页表物理地址。

          • 2: 中间10位是页表项pte的索引,用于在页表中定位pte,cpu获取中间10位后自动将将其乘4,再加上第一步中得到的页表的物理地址,这样便得到了pte索引对应的pte所在的物理地址,然后自动在该物理地址(该pte)中获取保存的普通物理页物理地址。

          • 3: 低12位是物理页内的偏移量,页大小是4KB,12位可寻址的范围正好是4KB,因此cpu便直接把低12位作为第二步中获取的物理页的偏移量,无需乘以4。用物理页的物理地址加上这低12位的和便是这32位虚拟地址最终落向的物理地址。

标签:物理地址,段页,内存,地址,--,描述符,页表,CPU,内核
来源: https://www.cnblogs.com/ccxdbk/p/14498147.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有